<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <title>Swagger spec for Ambari REST API</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta charset="UTF-8" />
  <script>
/*! jQuery v3.1.0 | (c) jQuery Foundation | jquery.org/license */
!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.0",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null!=a?a<0?this[a+this.length]:this[a]:f.call(this)},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e)}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){if(r.isFunction(b))return r.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return r.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(C.test(b))return r.filter(b,a,c);b=r.filter(b,a)}return r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType})}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/\S+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,
r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c||"false"!==c&&("null"===c?null:+c+""===c?+c:X.test(c)?JSON.parse(c):c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),Z(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=Z(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var $=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,_=new RegExp("^(?:([+-])=|)("+$+")([a-z%]*)$","i"),aa=["Top","Right","Bottom","Left"],ba=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ca=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function da(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&_.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ea={};function fa(a){var b,c=a.ownerDocument,d=a.nodeName,e=ea[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ea[d]=e,e)}function ga(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ba(d)&&(e[f]=fa(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ga(this,!0)},hide:function(){return ga(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ba(this)?r(this).show():r(this).hide()})}});var ha=/^(?:checkbox|radio)$/i,ia=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ja=/^$|\/(?:java|ecma)script/i,ka={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ka.optgroup=ka.option,ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead,ka.th=ka.td;function la(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function ma(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var na=/<|&#?\w+;/;function oa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(na.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ia.exec(f)||["",""])[1].toLowerCase(),i=ka[h]||ka._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=la(l.appendChild(f),"script"),j&&ma(g),c){k=0;while(f=g[k++])ja.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var pa=d.documentElement,qa=/^key/,ra=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,sa=/^([^.]*)(?:\.(.+)|)/;function ta(){return!0}function ua(){return!1}function va(){try{return d.activeElement}catch(a){}}function wa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)wa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ua;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(pa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;c<h;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?r(e,this).index(i)>-1:r.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==va()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===va()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ta:ua,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:ua,isPropagationStopped:ua,isImmediatePropagationStopped:ua,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ta,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ta,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ta,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&qa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ra.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return wa(this,a,b,c,d)},one:function(a,b,c,d){return wa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=ua),this.each(function(){r.event.remove(this,a,c,b)})}});var xa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,ya=/<script|<style|<link/i,za=/checked\s*(?:[^=]|=\s*.checked.)/i,Aa=/^true\/(.*)/,Ba=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ca(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Da(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ea(a){var b=Aa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ga(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ha.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ha(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&za.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(m&&(e=oa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(la(e,"script"),Da),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,la(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ea),l=0;l<i;l++)j=h[l],ja.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ba,""),k))}return a}function Ia(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(la(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&ma(la(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(xa,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=la(h),f=la(a),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);if(b)if(c)for(f=f||la(a),g=g||la(h),d=0,e=f.length;d<e;d++)Fa(f[d],g[d]);else Fa(a,h);return g=la(h,"script"),g.length>0&&ma(g,!i&&la(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(la(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!ya.test(a)&&!ka[(ia.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(la(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(la(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ja=/^margin/,Ka=new RegExp("^("+$+")(?!px)[a-z%]+$","i"),La=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",pa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,pa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Ma(a,b,c){var d,e,f,g,h=a.style;return c=c||La(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ka.test(g)&&Ja.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Na(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Oa=/^(none|table(?!-c[ea]).+)/,Pa={position:"absolute",visibility:"hidden",display:"block"},Qa={letterSpacing:"0",fontWeight:"400"},Ra=["Webkit","Moz","ms"],Sa=d.createElement("div").style;function Ta(a){if(a in Sa)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ra.length;while(c--)if(a=Ra[c]+b,a in Sa)return a}function Ua(a,b,c){var d=_.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Va(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+aa[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+aa[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+aa[f]+"Width",!0,e))):(g+=r.css(a,"padding"+aa[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+aa[f]+"Width",!0,e)));return g}function Wa(a,b,c){var d,e=!0,f=La(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Ma(a,b,f),(d<0||null==d)&&(d=a.style[b]),Ka.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Va(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ma(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=_.exec(c))&&e[1]&&(c=da(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Ma(a,b,d)),"normal"===e&&b in Qa&&(e=Qa[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Oa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Wa(a,b,d):ca(a,Pa,function(){return Wa(a,b,d)})},set:function(a,c,d){var e,f=d&&La(a),g=d&&Va(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=_.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ua(a,c,g)}}}),r.cssHooks.marginLeft=Na(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Ma(a,"marginLeft"))||a.getBoundingClientRect().left-ca(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+aa[d]+b]=f[d]||f[d-2]||f[0];return e}},Ja.test(a)||(r.cssHooks[a+b].set=Ua)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=La(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Xa(a,b,c,d,e){return new Xa.prototype.init(a,b,c,d,e)}r.Tween=Xa,Xa.prototype={constructor:Xa,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Xa.propHooks[this.prop];return a&&a.get?a.get(this):Xa.propHooks._default.get(this)},run:function(a){var b,c=Xa.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Xa.propHooks._default.set(this),this}},Xa.prototype.init.prototype=Xa.prototype,Xa.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Xa.propHooks.scrollTop=Xa.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Xa.prototype.init,r.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=/queueHooks$/;function ab(){Za&&(a.requestAnimationFrame(ab),r.fx.tick())}function bb(){return a.setTimeout(function(){Ya=void 0}),Ya=r.now()}function cb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=aa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function db(a,b,c){for(var d,e=(gb.tweeners[b]||[]).concat(gb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function eb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ba(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],$a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ga([a],!0),j=a.style.display||j,k=r.css(a,"display"),ga([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ga([a],!0),m.done(function(){p||ga([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=db(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function fb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function gb(a,b,c){var d,e,f=0,g=gb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Ya||bb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Ya||bb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(fb(k,j.opts.specialEasing);f<g;f++)if(d=gb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,db,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(gb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return da(c.elem,a,_.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a[d],gb.tweeners[c]=gb.tweeners[c]||[],gb.tweeners[c].unshift(b)},prefilters:[eb],prefilter:function(a,b){b?gb.prefilters.unshift(a):gb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:e.duration="number"==typeof e.duration?e.duration:e.duration in r.fx.speeds?r.fx.speeds[e.duration]:r.fx.speeds._default,null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ba).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=gb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&_a.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(cb(b,!0),a,d,e)}}),r.each({slideDown:cb("show"),slideUp:cb("hide"),slideToggle:cb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Ya=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Ya=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){Za||(Za=a.requestAnimationFrame?a.requestAnimationFrame(ab):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame(Za):a.clearInterval(Za),Za=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var hb,ib=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?hb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);
if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),hb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ib[b]||r.find.attr;ib[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ib[g],ib[g]=e,e=null!=c(a,b,d)?g:null,ib[g]=f),e}});var jb=/^(?:input|select|textarea|button)$/i,kb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):jb.test(a.nodeName)||kb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});var lb=/[\t\r\n\f]/g;function mb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,mb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,mb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,mb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=mb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(c)+" ").replace(lb," ").indexOf(b)>-1)return!0;return!1}});var nb=/\r/g,ob=/[\x20\t\r\n\f]+/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(nb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:r.trim(r.text(a)).replace(ob," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=e<0?h:f?e:0;i<h;i++)if(c=d[i],(c.selected||i===e)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ha.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,""),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=oa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=r.trim(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||pa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Na(o.pixelPosition,function(a,c){if(c)return c=Ma(a,b),Ka.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r});
</script>

  <script>
!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],a=
b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a<f;++a){var h=b[a];if(/\\[bdsw]/i.test(h))c.push(h);else{var h=d(h),l;a+2<f&&"-"===b[a+1]?(l=d(b[a+2]),a+=2):l=h;e.push([h,l]);l<65||h>122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=f[1]+1?f[1]=Math.max(f[1],h[1]):b.push(f=h);for(a=0;a<b.length;++a)h=b[a],c.push(g(h[0])),
h[1]>h[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f<c;++f){var l=a[f];l==="("?++h:"\\"===l.charAt(0)&&(l=+l.substring(1))&&(l<=h?d[l]=-1:a[f]=g(l))}for(f=1;f<d.length;++f)-1===d[f]&&(d[f]=++x);for(h=f=0;f<c;++f)l=a[f],l==="("?(++h,d[h]||(a[f]="(?:")):"\\"===l.charAt(0)&&(l=+l.substring(1))&&l<=h&&
(a[f]="\\"+d[l]);for(f=0;f<c;++f)"^"===a[f]&&"^"!==a[f+1]&&(a[f]="");if(e.ignoreCase&&m)for(f=0;f<c;++f)l=a[f],e=l.charAt(0),l.length>=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k<c;++k){var i=a[k];if(i.ignoreCase)j=!0;else if(/[a-z]/i.test(i.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){m=!0;j=!1;break}}for(var r={b:8,t:9,n:10,v:11,
f:12,r:13},n=[],k=0,c=a.length;k<c;++k){i=a[k];if(i.global||i.multiline)throw Error(""+i);n.push("(?:"+s(i)+")")}return RegExp(n.join("|"),j?"gi":"g")}function T(a,d){function g(a){var c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)g(c);c=a.nodeName.toLowerCase();if("br"===c||"li"===c)s[j]="\n",m[j<<1]=x++,m[j++<<1|1]=a}}else if(c==3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,"\n"):c.replace(/[\t\n\r ]+/g," "),s[j]=c,m[j<<1]=x,x+=c.length,m[j++<<1|1]=
a)}var b=/(?:^|\s)nocode(?:\s|$)/,s=[],x=0,m=[],j=0;g(a);return{a:s.join("").replace(/\n$/,""),d:m}}function H(a,d,g,b){d&&(a={a:d,e:a},g(a),b.push.apply(b,a.g))}function U(a){for(var d=void 0,g=a.firstChild;g;g=g.nextSibling)var b=g.nodeType,d=b===1?d?a:g:b===3?V.test(g.nodeValue)?a:d:d;return d===a?void 0:d}function C(a,d){function g(a){for(var j=a.e,k=[j,"pln"],c=0,i=a.a.match(s)||[],r={},n=0,e=i.length;n<e;++n){var z=i[n],w=r[z],t=void 0,f;if(typeof w==="string")f=!1;else{var h=b[z.charAt(0)];
if(h)t=z.match(h[1]),w=h[0];else{for(f=0;f<x;++f)if(h=d[f],t=z.match(h[1])){w=h[0];break}t||(w="pln")}if((f=w.length>=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.length;c<i;++c){var r=
g[c],n=r[3];if(n)for(var e=n.length;--e>=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d.push(["com",
/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+"]|\\x5C"+
s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,
q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b(a,c){var d=
c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i<c.length;++i)b(c[i]);d===(d|0)&&c[0].setAttribute("value",d);var r=j.createElement("ol");
r.className="linenums";for(var d=Math.max(0,d-1|0)||0,i=0,n=c.length;i<n;++i)k=c[i],k.className="L"+(i+d)%10,k.firstChild||k.appendChild(j.createTextNode("\u00a0")),r.appendChild(k);a.appendChild(r)}function p(a,d){for(var g=d.length;--g>=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";return F[a]}function K(a){var d=a.h;try{var g=T(a.c,a.i),b=g.a;
a.a=b;a.d=g.d;a.e=0;I(d,b)(a);var s=/\bMSIE\s(\d+)/.exec(navigator.userAgent),s=s&&+s[1]<=8,d=/\n/g,x=a.a,m=x.length,g=0,j=a.d,k=j.length,b=0,c=a.g,i=c.length,r=0;c[i]=m;var n,e;for(e=n=0;e<i;)c[e]!==c[e+2]?(c[n++]=c[e++],c[n++]=c[e++]):e+=2;i=n;for(e=n=0;e<i;){for(var p=c[e],w=c[e+1],t=e+2;t+2<=i&&c[t+1]===w;)t+=2;c[n++]=p;c[n++]=w;e=t}c.length=n;var f=a.c,h;if(f)h=f.style.display,f.style.display="none";try{for(;b<k;){var l=j[b+2]||m,B=c[r+2]||m,t=Math.min(l,B),A=j[b+1],G;if(A.nodeType!==1&&(G=x.substring(g,
t))){s&&(G=G.replace(d,"\r"));A.nodeValue=G;var L=A.ownerDocument,o=L.createElement("span");o.className=c[r+1];var v=A.parentNode;v.replaceChild(o,A);o.appendChild(A);g<l&&(j[b+1]=A=L.createTextNode(x.substring(t,l)),v.insertBefore(A,o.nextSibling))}g=t;g>=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],
O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,
V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",
/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],
["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:R}),
["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);p(v({keywords:Q,
hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);
p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="<pre>"+a+"</pre>";b=b.firstChild;g&&J(b,g,!0);K({h:d,j:g,c:b,i:1});
return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i<p.length&&c.now()<b;i++){for(var d=p[i],j=h,k=d;k=k.previousSibling;){var m=k.nodeType,o=(m===7||m===8)&&k.nodeValue;if(o?!/^\??prettify\b/.test(o):m!==3||/\S/.test(k.nodeValue))break;if(o){j={};o.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(a,b,c){j[b]=c});break}}k=d.className;if((j!==h||e.test(k))&&!v.test(k)){m=!1;for(o=d.parentNode;o;o=o.parentNode)if(f.test(o.tagName)&&
o.className&&e.test(o.className)){m=!0;break}if(!m){d.className+=" prettyprinted";m=j.lang;if(!m){var m=k.match(n),y;if(!m&&(y=U(d))&&t.test(y.tagName))m=y.className.match(n);m&&(m=m[1])}if(w.test(d.tagName))o=1;else var o=d.currentStyle,u=s.defaultView,o=(o=o?o.whiteSpace:u&&u.getComputedStyle?u.getComputedStyle(d,q).getPropertyValue("white-space"):0)&&"pre"===o.substring(0,3);u=j.linenums;if(!(u=u==="true"||+u))u=(u=k.match(/\blinenums\b(?::(\d+))?/))?u[1]&&u[1].length?+u[1]:!0:!1;u&&J(d,u,o);r=
{h:m,c:d,j:u,i:o};K(r)}}}i<p.length?setTimeout(g,250):"function"===typeof a&&a()}for(var b=d||document.body,s=b.ownerDocument||document,b=[b.getElementsByTagName("pre"),b.getElementsByTagName("code"),b.getElementsByTagName("xmp")],p=[],m=0;m<b.length;++m)for(var j=0,k=b[m].length;j<k;++j)p.push(b[m][j]);var b=q,c=Date;c.now||(c={now:function(){return+new Date}});var i=0,r,n=/\blang(?:uage)?-([\w.]+)(?!\S)/,e=/\bprettyprint\b/,v=/\bprettyprinted\b/,w=/pre|xmp/i,t=/^code$/i,f=/^(?:pre|code|xmp)$/i,
h={};g()}};typeof define==="function"&&define.amd&&define("google-code-prettify",[],function(){return Y})})();}()
</script>

  <script>
/*!
* Bootstrap.js by @fat & @mdo
* Copyright 2013 Twitter, Inc.
* http://www.apache.org/licenses/LICENSE-2.0.txt
*/
!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(".dropdown-backdrop").remove(),e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||("ontouchstart"in document.documentElement&&e('<div class="dropdown-backdrop"/>').insertBefore(e(this)).on("click",r),s.toggleClass("open")),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f<s.length-1&&f++,~f||(f=0),s.eq(f).focus()}};var s=e.fn.dropdown;e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e.fn.dropdown.noConflict=function(){return e.fn.dropdown=s,this},e(document).on("click.dropdown.data-api",r).on("click.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(){var e=this;this.$element.hide(),this.backdrop(function(){e.removeBackdrop(),e.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!t)return;i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,t):t()):t&&t()}};var n=e.fn.modal;e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e.fn.modal.noConflict=function(){return e.fn.modal=n,this},e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s,o,u,a;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,o=this.options.trigger.split(" ");for(a=o.length;a--;)u=o[a],u=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):u!="manual"&&(i=u=="hover"?"mouseenter":"focus",s=u=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,this.$element.data(),t),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e.fn[this.type].defaults,r={},i;this._options&&e.each(this._options,function(e,t){n[e]!=t&&(r[e]=t)},this),i=e(t.currentTarget)[this.type](r).data(this.type);if(!i.options.delay||!i.options.delay.show)return i.show();clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){i.hoverState=="in"&&i.show()},i.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var t,n,r,i,s,o,u=e.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(u);if(u.isDefaultPrevented())return;t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,t.detach().css({top:0,left:0,display:"block"}),this.options.container?t.appendTo(this.options.container):t.insertAfter(this.$element),n=this.getPosition(),r=t[0].offsetWidth,i=t[0].offsetHeight;switch(s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}this.applyPlacement(o,s),this.$element.trigger("shown")}},applyPlacement:function(e,t){var n=this.tip(),r=n[0].offsetWidth,i=n[0].offsetHeight,s,o,u,a;n.offset(e).addClass(t).addClass("in"),s=n[0].offsetWidth,o=n[0].offsetHeight,t=="top"&&o!=i&&(e.top=e.top+i-o,a=!0),t=="bottom"||t=="top"?(u=0,e.left<0&&(u=e.left*-2,e.left=0,n.offset(e),s=n[0].offsetWidth,o=n[0].offsetHeight),this.replaceArrow(u-r+s,s,"left")):this.replaceArrow(o-i,o,"top"),a&&n.offset(e)},replaceArrow:function(e,t,n){this.arrow().css(n,e?50*(1-e/t)+"%":"")},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function i(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip(),r=e.Event("hide");this.$element.trigger(r);if(r.isDefaultPrevented())return;return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?i():n.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var t=this.$element[0];return e.extend({},typeof t.getBoundingClientRect=="function"?t.getBoundingClientRect():{width:t.offsetWidth,height:t.offsetHeight},this.$element.offset())},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=t?e(t.currentTarget)[this.type](this._options).data(this.type):this;n.tip().hasClass("in")?n.hide():n.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=(typeof n.content=="function"?n.content.call(t[0]):n.content)||t.attr("data-content"),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var n=e(this),r=n.data("target")||n.attr("href"),i=/^#\w/.test(r)&&e(r);return i&&i.length&&[[i.position().top+(!e.isWindow(t.$scrollElement.get(0))&&t.$scrollElement.scrollTop()),r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}};var n=e.fn.scrollspy;e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=n,this},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}};var n=e.fn.tab;e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this},e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=e(this.options.menu),this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:t.top+t.height,left:t.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery);
</script>

  <script>
/**
 * marked - a markdown parser
 * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
 * https://github.com/chjj/marked
 */
(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+block.def.source+")")();block.blockquote=replace(block.blockquote)("def",block.def)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b";block.html=replace(block.html)("comment",/<!--[\s\S]*?-->/)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1","\\2")+"|"+block.list.source.replace("\\1","\\3")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm){if(this.options.tables){this.rules=block.tables}else{this.rules=block.gfm}}}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g,"    ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top,bq){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1){this.tokens.push({type:"space"})}}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]||""});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i<item.align.length;i++){if(/^ *-+: *$/.test(item.align[i])){item.align[i]="right"}else if(/^ *:-+: *$/.test(item.align[i])){item.align[i]="center"}else if(/^ *:-+ *$/.test(item.align[i])){item.align[i]="left"}else{item.align[i]=null}}for(i=0;i<item.cells.length;i++){item.cells[i]=item.cells[i].split(/ *\| */)}this.tokens.push(item);continue}if(cap=this.rules.lheading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[2]==="="?1:2,text:cap[1]});continue}if(cap=this.rules.hr.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"hr"});continue}if(cap=this.rules.blockquote.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"blockquote_start"});cap=cap[0].replace(/^ *> ?/gm,"");this.token(cap,top,true);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i<l;i++){item=cap[i];space=item.length;item=item.replace(/^ *([*+-]|\d+\.) +/,"");if(~item.indexOf("\n ")){space-=item.length;item=!this.options.pedantic?item.replace(new RegExp("^ {1,"+space+"}","gm"),""):item.replace(/^ {1,4}/gm,"")}if(this.options.smartLists&&i!==l-1){b=block.bullet.exec(cap[i+1])[0];if(bull!==b&&!(bull.length>1&&b.length>1)){src=cap.slice(i+1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item.charAt(item.length-1)==="\n";if(!loose)loose=next}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false,bq);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&(cap[1]==="pre"||cap[1]==="script"||cap[1]==="style"),text:cap[0]});continue}if(!bq&&top&&(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i<item.align.length;i++){if(/^ *-+: *$/.test(item.align[i])){item.align[i]="right"}else if(/^ *:-+: *$/.test(item.align[i])){item.align[i]="center"}else if(/^ *:-+ *$/.test(item.align[i])){item.align[i]="left"}else{item.align[i]=null}}for(i=0;i<item.cells.length;i++){item.cells[i]=item.cells[i].replace(/^ *\| *| *\| *$/g,"").split(/ *\| */)}this.tokens.push(item);continue}if(top&&(cap=this.rules.paragraph.exec(src))){src=src.substring(cap[0].length);this.tokens.push({type:"paragraph",text:cap[1].charAt(cap[1].length-1)==="\n"?cap[1].slice(0,-1):cap[1]});continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"text",text:cap[0]});continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return this.tokens};var inline={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/};inline._inside=/(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/;inline._href=/\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;this.renderer=this.options.renderer||new Renderer;this.renderer.options=this.options;if(!this.links){throw new Error("Tokens array requires a `links` property.")}if(this.options.gfm){if(this.options.breaks){this.rules=inline.breaks}else{this.rules=inline.gfm}}else if(this.options.pedantic){this.rules=inline.pedantic}}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1].charAt(6)===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+=this.renderer.link(href,null,text);continue}if(!this.inLink&&(cap=this.rules.url.exec(src))){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+=this.renderer.link(href,null,text);continue}if(cap=this.rules.tag.exec(src)){if(!this.inLink&&/^<a /i.test(cap[0])){this.inLink=true}else if(this.inLink&&/^<\/a>/i.test(cap[0])){this.inLink=false}src=src.substring(cap[0].length);out+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(cap[0]):escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);this.inLink=true;out+=this.outputLink(cap,{href:cap[2],title:cap[3]});this.inLink=false;continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0].charAt(0);src=cap[0].substring(1)+src;continue}this.inLink=true;out+=this.outputLink(cap,link);this.inLink=false;continue}if(cap=this.rules.strong.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.strong(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.em(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.codespan(escape(cap[2],true));continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.br();continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.del(this.output(cap[1]));continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.text(escape(this.smartypants(cap[0])));continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return out};InlineLexer.prototype.outputLink=function(cap,link){var href=escape(link.href),title=link.title?escape(link.title):null;return cap[0].charAt(0)!=="!"?this.renderer.link(href,title,this.output(cap[1])):this.renderer.image(href,title,escape(cap[1]))};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…")};InlineLexer.prototype.mangle=function(text){if(!this.options.mangle)return text;var out="",l=text.length,i=0,ch;for(;i<l;i++){ch=text.charCodeAt(i);if(Math.random()>.5){ch="x"+ch.toString(16)}out+="&#"+ch+";"}return out};function Renderer(options){this.options=options||{}}Renderer.prototype.code=function(code,lang,escaped){if(this.options.highlight){var out=this.options.highlight(code,lang);if(out!=null&&out!==code){escaped=true;code=out}}if(!lang){return"<pre><code>"+(escaped?code:escape(code,true))+"\n</code></pre>"}return'<pre><code class="'+this.options.langPrefix+escape(lang,true)+'">'+(escaped?code:escape(code,true))+"\n</code></pre>\n"};Renderer.prototype.blockquote=function(quote){return"<blockquote>\n"+quote+"</blockquote>\n"};Renderer.prototype.html=function(html){return html};Renderer.prototype.heading=function(text,level,raw){return"<h"+level+' id="'+this.options.headerPrefix+raw.toLowerCase().replace(/[^\w]+/g,"-")+'">'+text+"</h"+level+">\n"};Renderer.prototype.hr=function(){return this.options.xhtml?"<hr/>\n":"<hr>\n"};Renderer.prototype.list=function(body,ordered){var type=ordered?"ol":"ul";return"<"+type+">\n"+body+"</"+type+">\n"};Renderer.prototype.listitem=function(text){return"<li>"+text+"</li>\n"};Renderer.prototype.paragraph=function(text){return"<p>"+text+"</p>\n"};Renderer.prototype.table=function(header,body){return"<table>\n"+"<thead>\n"+header+"</thead>\n"+"<tbody>\n"+body+"</tbody>\n"+"</table>\n"};Renderer.prototype.tablerow=function(content){return"<tr>\n"+content+"</tr>\n"};Renderer.prototype.tablecell=function(content,flags){var type=flags.header?"th":"td";var tag=flags.align?"<"+type+' style="text-align:'+flags.align+'">':"<"+type+">";return tag+content+"</"+type+">\n"};Renderer.prototype.strong=function(text){return"<strong>"+text+"</strong>"};Renderer.prototype.em=function(text){return"<em>"+text+"</em>"};Renderer.prototype.codespan=function(text){return"<code>"+text+"</code>"};Renderer.prototype.br=function(){return this.options.xhtml?"<br/>":"<br>"};Renderer.prototype.del=function(text){return"<del>"+text+"</del>"};Renderer.prototype.link=function(href,title,text){if(this.options.sanitize){try{var prot=decodeURIComponent(unescape(href)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return""}if(prot.indexOf("javascript:")===0||prot.indexOf("vbscript:")===0){return""}}var out='<a href="'+href+'"';if(title){out+=' title="'+title+'"'}out+=">"+text+"</a>";return out};Renderer.prototype.image=function(href,title,text){var out='<img src="'+href+'" alt="'+text+'"';if(title){out+=' title="'+title+'"'}out+=this.options.xhtml?"/>":">";return out};Renderer.prototype.text=function(text){return text};function Parser(options){this.tokens=[];this.token=null;this.options=options||marked.defaults;this.options.renderer=this.options.renderer||new Renderer;this.renderer=this.options.renderer;this.renderer.options=this.options}Parser.parse=function(src,options,renderer){var parser=new Parser(options,renderer);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options,this.renderer);this.tokens=src.reverse();var out="";while(this.next()){out+=this.tok()}return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;while(this.peek().type==="text"){body+="\n"+this.next().text}return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case"space":{return""}case"hr":{return this.renderer.hr()}case"heading":{return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text)}case"code":{return this.renderer.code(this.token.text,this.token.lang,this.token.escaped)}case"table":{var header="",body="",i,row,cell,flags,j;cell="";for(i=0;i<this.token.header.length;i++){flags={header:true,align:this.token.align[i]};cell+=this.renderer.tablecell(this.inline.output(this.token.header[i]),{header:true,align:this.token.align[i]})}header+=this.renderer.tablerow(cell);for(i=0;i<this.token.cells.length;i++){row=this.token.cells[i];cell="";for(j=0;j<row.length;j++){cell+=this.renderer.tablecell(this.inline.output(row[j]),{header:false,align:this.token.align[j]})}body+=this.renderer.tablerow(cell)}return this.renderer.table(header,body)}case"blockquote_start":{var body="";while(this.next().type!=="blockquote_end"){body+=this.tok()}return this.renderer.blockquote(body)}case"list_start":{var body="",ordered=this.token.ordered;while(this.next().type!=="list_end"){body+=this.tok()}return this.renderer.list(body,ordered)}case"list_item_start":{var body="";while(this.next().type!=="list_item_end"){body+=this.token.type==="text"?this.parseText():this.tok()}return this.renderer.listitem(body)}case"loose_item_start":{var body="";while(this.next().type!=="list_item_end"){body+=this.tok()}return this.renderer.listitem(body)}case"html":{var html=!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text;return this.renderer.html(html)}case"paragraph":{return this.renderer.paragraph(this.inline.output(this.token.text))}case"text":{return this.renderer.paragraph(this.parseText())}}};function escape(html,encode){return html.replace(!encode?/&(?!#?\w+;)/g:/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function unescape(html){return html.replace(/&([#\w]+);/g,function(_,n){n=n.toLowerCase();if(n==="colon")return":";if(n.charAt(0)==="#"){return n.charAt(1)==="x"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1))}return""})}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=1,target,key;for(;i<arguments.length;i++){target=arguments[i];for(key in target){if(Object.prototype.hasOwnProperty.call(target,key)){obj[key]=target[key]}}}return obj}function marked(src,opt,callback){if(callback||typeof opt==="function"){if(!callback){callback=opt;opt=null}opt=merge({},marked.defaults,opt||{});var highlight=opt.highlight,tokens,pending,i=0;try{tokens=Lexer.lex(src,opt)}catch(e){return callback(e)}pending=tokens.length;var done=function(err){if(err){opt.highlight=highlight;return callback(err)}var out;try{out=Parser.parse(tokens,opt)}catch(e){err=e}opt.highlight=highlight;return err?callback(err):callback(null,out)};if(!highlight||highlight.length<3){return done()}delete opt.highlight;if(!pending)return done();for(;i<tokens.length;i++){(function(token){if(token.type!=="code"){return--pending||done()}return highlight(token.text,token.lang,function(err,code){if(err)return done(err);if(code==null||code===token.text){return--pending||done()}token.text=code;token.escaped=true;--pending||done()})})(tokens[i])}return}try{if(opt)opt=merge({},marked.defaults,opt);return Parser.parse(Lexer.lex(src,opt),opt)}catch(e){e.message+="\nPlease report this to https://github.com/chjj/marked.";if((opt||marked.defaults).silent){return"<p>An error occured:</p><pre>"+escape(e.message+"",true)+"</pre>"}throw e}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,sanitizer:null,mangle:true,smartLists:false,silent:false,highlight:null,langPrefix:"lang-",smartypants:false,headerPrefix:"",renderer:new Renderer,xhtml:false};marked.Parser=Parser;marked.parser=Parser.parse;marked.Renderer=Renderer;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;marked.parse=marked;if(typeof module!=="undefined"&&typeof exports==="object"){module.exports=marked}else if(typeof define==="function"&&define.amd){define(function(){return marked})}else{this.marked=marked}}).call(function(){return this||(typeof window!=="undefined"?window:global)}());
</script>
  <script>
    $( document ).ready(function() {
      marked.setOptions({
        renderer: new marked.Renderer(),
        gfm: true,
        tables: true,
        breaks: false,
        pedantic: false,
        sanitize: false,
        smartLists: true,
        smartypants: false
      });

      var textFile = null;

      /// Function to be used to download a text json schema
      function makeTextFile(text) {

        var data = new Blob([text], {type: 'text/plain'});

        // If we are replacing a previously generated file we need to
        // manually revoke the object URL to avoid memory leaks.
        if (textFile !== null) {
          window.URL.revokeObjectURL(textFile);
        }

        textFile = window.URL.createObjectURL(data);

        var a = document.createElement("a");
        document.body.appendChild(a);
        a.style = "display: none";
        a.href = textFile;
        a.download = 'schema.txt';
        a.click();

        return textFile;
      };

      /// TODO: Implement resizing for expanding within iframe
      function callResize() {
        window.parent.postMessage('resize', "*");
      }

      function processMarked() {
        $(".marked").each(function() {
          $(this).html(marked($(this).html()));
        });
      }


      // load google web fonts
      loadGoogleFontCss();


      // Bootstrap Scrollspy
      $(this).scrollspy({ target: '#scrollingNav', offset: 18 });

      // Content-Scroll on Navigation click.
      $('.sidenav').find('a').on('click', function(e) {
          e.preventDefault();
          var id = $(this).attr('href');
          if ($(id).length > 0)
              $('html,body').animate({ scrollTop: parseInt($(id).offset().top) }, 400);
          window.location.hash = $(this).attr('href');
      });

      // Quickjump on Pageload to hash position.
      if(window.location.hash) {
          var id = window.location.hash;
          if ($(id).length > 0)
              $('html,body').animate({ scrollTop: parseInt($(id).offset().top) }, 0);
      }


      function initDynamic() {
        // tabs
        $('.nav-tabs-examples a').click(function (e) {
            e.preventDefault();
            $(this).tab('show');
        });


        $('.nav-tabs-examples').find('a:first').tab('show');

        // call scrollspy refresh method
        $(window).scrollspy('refresh');
      }

      initDynamic();

      // Pre- / Code-Format
      prettyPrint();

      //Convert elements with "marked" class to markdown
      processMarked();

      /**
       * Load google fonts.
       */
      function loadGoogleFontCss() {
        WebFont.load({
          active: function() {
            // Update scrollspy
            $(window).scrollspy('refresh')
          },
          google: {
            families: ['Source Code Pro', 'Source Sans Pro:n4,n6,n7']
          }
        });
      }
    });
  </script>
  <style type="text/css">
  
/*!
 * Bootstrap v2.3.2
 *
 * Copyright 2013 Twitter, Inc
 * Licensed under the Apache License v2.0
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Designed and built with all the love in the world by @mdo and @fat.
 */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}

  /* Pretty printing styles. Used with prettify.js. */
/* Vim sunburst theme by David Leibovic */
pre .str {
  color: #65B042;
}
/* string  - green */
pre .kwd {
  color: #E28964;
}
/* keyword - dark pink */
pre .com {
  color: #AEAEAE;
  font-style: italic;
}
/* comment - gray */
pre .typ {
  color: #89bdff;
}
/* type - light blue */
pre .lit {
  color: #3387CC;
}
/* literal - blue */
pre .pun {
  color: #fff;
}
/* punctuation - white */
pre .pln {
  color: #fff;
}
/* plaintext - white */
pre .tag {
  color: #89bdff;
}
/* html/xml tag    - light blue */
pre .atn {
  color: #bdb76b;
}
/* html/xml attribute name  - khaki */
pre .atv {
  color: #65B042;
}
/* html/xml attribute value - green */
pre .dec {
  color: #3387CC;
}
/* decimal - blue */
/* Specify class=linenums on a pre to get line numbering */
ol.linenums {
  margin-top: 0;
  margin-bottom: 0;
  color: #AEAEAE;
}
/* IE indents via margin-left */
li.L0,
li.L1,
li.L2,
li.L3,
li.L5,
li.L6,
li.L7,
li.L8 {
  list-style-type: none;
}
/* Alternate shading for lines */
@media print {
  pre .str {
    color: #060;
  }
  pre .kwd {
    color: #006;
    font-weight: bold;
  }
  pre .com {
    color: #600;
    font-style: italic;
  }
  pre .typ {
    color: #404;
    font-weight: bold;
  }
  pre .lit {
    color: #044;
  }
  pre .pun {
    color: #440;
  }
  pre .pln {
    color: #000;
  }
  pre .tag {
    color: #006;
    font-weight: bold;
  }
  pre .atn {
    color: #404;
  }
  pre .atv {
    color: #060;
  }
}
  /* ------------------------------------------------------------------------------------------
 * Content
 * ------------------------------------------------------------------------------------------ */
body {
  min-width: 980px;
}

body, p, a, div, th, td {
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 400;
  font-size: 16px;
  text-shadow: none !important;
}

td.code {
  font-size: 14px;
  font-family: "Source Code Pro", monospace;
  font-style: normal;
  font-weight: 400;
}

#content {
  padding-top: 16px;
  z-Index: -1;
  margin-left: 270px;
}

p {
  color: #808080;
}

h1 {
  font-family: "Source Sans Pro Semibold", sans-serif;
  font-weight: normal;
  font-size: 44px;
  line-height: 50px;
  margin: 0 0 10px 0;
  padding: 0;
}

h2 {
  font-family: "Source Sans Pro", sans-serif;
  font-weight: normal;
  font-size: 24px;
  line-height: 40px;
  margin: 0 0 20px 0;
  padding: 0;
}

section {
  border-top: 1px solid #ebebeb;
  padding: 30px 0;
}

section h1 {
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 700;
  font-size: 32px;
  line-height: 40px;
  padding-bottom: 14px;
  margin: 0 0 20px 0;
  padding: 0;
}

article {
  padding: 14px 0 30px 0;
}

article h1 {
  font-family: "Source Sans Pro Bold", sans-serif;
  font-weight: 600;
  font-size: 24px;
  line-height: 26px;
}

article h2 {
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 600;
  font-size: 18px;
  line-height: 24px;
  margin: 0 0 10px 0;
}

article h3 {
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 600;
  font-size: 16px;
  line-height: 18px;
  margin: 0 0 10px 0;
}

article h4 {
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 600;
  font-size: 14px;
  line-height: 16px;
  margin: 0 0 8px 0;
}

table {
  border-collapse: collapse;
  width: 100%;
  margin: 0 0 20px 0;
}

th {
  background-color: #f5f5f5;
  text-align: left;
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 700;
  padding: 4px 8px;
  border: #e0e0e0 1px solid;
}

td {
  vertical-align: top;
  padding: 2px 8px;
  border: #e0e0e0 1px solid;
}

#generator .content {
  color: #b0b0b0;
  border-top: 1px solid #ebebeb;
  padding: 10px 0;
}

.label-optional {
  float: right;
}

.open-left {
  right: 0;
  left: auto;
}

/* ------------------------------------------------------------------------------------------
 * apidoc - intro
 * ------------------------------------------------------------------------------------------ */

#apidoc .apidoc {
  border-top: 1px solid #ebebeb;
  padding: 30px 0;
}

#apidoc h1 {
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 700;
  font-size: 32px;
  line-height: 40px;
  padding-bottom: 14px;
  margin: 0 0 20px 0;
  padding: 0;
}

#apidoc h2 {
  font-family: "Source Sans Pro Bold", sans-serif;
  font-weight: 600;
  font-size: 22px;
  line-height: 26px;
  padding-top: 14px;
}

/* ------------------------------------------------------------------------------------------
 * pre / code
 * ------------------------------------------------------------------------------------------ */
pre {
  background-color: #292b36;
  color: #ffffff;
  padding: 10px;
  border-radius: 6px;
  position: relative;
  margin: 10px 0 20px 0;
}

code.language-text {
  word-wrap: break-word;
}

pre.language-json {
  overflow: auto;
}

pre.language-html {
  margin: 40px 0 20px 0;
}

pre.language-html:before {
  content: attr(data-type);
  position: absolute;
  top: -30px;
  left: 0;
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 600;
  font-size: 15px;
  display: inline-block;
  padding: 2px 5px;
  border-radius: 6px;
  text-transform: uppercase;
  background-color: #3387CC;
  color: #ffffff;
}

pre.language-html[data-type="get"]:before {
  background-color: green;
}

pre.language-html[data-type="put"]:before {
  background-color: #e5c500;
}

pre.language-html[data-type="post"]:before {
  background-color: #4070ec;
}

pre.language-html[data-type="delete"]:before {
  background-color: #ed0039;
}

pre.language-api .str {
  color: #ffffff;
}

pre.language-api .pln,
pre.language-api .pun {
  color: #65B042;
}

pre code {
  display: block;
  font-size: 14px;
  font-family: "Source Code Pro", monospace;
  font-style: normal;
  font-weight: 400;
}

pre code.sample-request-response-json {
  white-space: pre-wrap;
  max-height: 500px;
  overflow: auto;
}

/* ------------------------------------------------------------------------------------------
 * Sidenav
 * ------------------------------------------------------------------------------------------ */
.sidenav {
  width: 228px;
  margin: 0;
  padding: 20px;
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  overflow-x: hidden;
  overflow-y: auto;
  background-color: #f5f5f5;
  z-index: 10;
}

.sidenav > li > a {
  display: block;
  width: 192px;
  margin: 0;
  padding: 2px 11px;
  border: 0;
  border-left: transparent 4px solid;
  border-right: transparent 4px solid;
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 400;
  font-size: 14px;
}

.sidenav > li.nav-header > a {
  padding: 5px 15px;
  border: 1px solid #e5e5e5;
  width: 190px;
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 700;
  font-size: 16px;
  background-color: #4c8eca;
  color: #fff;
}

.sidenav > li.nav-header.active > a {
  background-color: #4c8eca;
  color: #fff;
}


00427D

.sidenav > .active > a {
  position: relative;
  z-index: 2;
}

.sidenav > li > a:hover {
  background-color: #ffffff;
}

.sidenav > li.has-modifications a {
  border-right: #60d060 4px solid;
}

.sidenav > li.is-new a {
  border-left: #e5e5e5 4px solid;
}



/* ------------------------------------------------------------------------------------------
 * Tabs
 * ------------------------------------------------------------------------------------------ */
ul.nav-tabs {
  margin: 0;
}

/* ------------------------------------------------------------------------------------------
 * Print
 * ------------------------------------------------------------------------------------------ */

@media print {

  #sidenav,
  #version,
  #versions,
  section .version,
  section .versions {
    display: none;
  }

  #content {
    margin-left: 0;
  }

  a {
    text-decoration: none;
    color: inherit;
  }

  a:after {
    content: " [" attr(href) "] ";
  }

  p {
    color: #000000
  }

  pre {
    background-color: #ffffff;
    color: #000000;
    padding: 10px;
    border: #808080 1px solid;
    border-radius: 6px;
    position: relative;
    margin: 10px 0 20px 0;
  }

} /* /@media print */


.doc-chapter
{
display:none;
background-color: #eee;
border-radius: 1px;
padding: 10px;
margin-bottom: 20px;
}































/*!
 * json-schema-view-js
 * https://github.com/mohsen1/json-schema-view-js#readme
 * Version: 0.4.1 - 2015-11-12T17:19:27.615Z
 * License: MIT
 */.json-schema-view .toggle-handle:after,.json-schema-view.json-schema-view-dark .toggle-handle:after,json-schema-view .toggle-handle:after,json-schema-view[json-schema-view-dark] .toggle-handle:after{content:"\25BC"}.json-schema-view .title,.json-schema-view.json-schema-view-dark .title,json-schema-view .title,json-schema-view[json-schema-view-dark] .title{font-weight:700;cursor:pointer}.json-schema-view,json-schema-view{font-family:monospace;font-size:0;display:table-cell}.json-schema-view>*,json-schema-view>*{font-size:14px}.json-schema-view .toggle-handle,json-schema-view .toggle-handle{cursor:pointer;margin:auto .3em;font-size:10px;display:inline-block;transform-origin:50% 40%;transition:transform 150ms ease-in}.json-schema-view .toggle-handle,.json-schema-view .toggle-handle:hover,json-schema-view .toggle-handle,json-schema-view .toggle-handle:hover{text-decoration:none;color:#333}.json-schema-view .description,json-schema-view .description{color:gray;font-style:italic}
   .pattern {
    color: blue;
  }
  .default {
    color: black;
  }
  .required {
    color:black;
  }
  .json-schema-view .title,.json-schema-view .title:hover,json-schema-view .title,json-schema-view .title:hover{text-decoration:none;color:#333}.json-schema-view .brace,.json-schema-view .bracket,.json-schema-view .title,json-schema-view .brace,json-schema-view .bracket,json-schema-view .title{color:#333}.json-schema-view .property,json-schema-view .property{font-size:0;display:table-row}.json-schema-view .property>*,json-schema-view .property>*{font-size:14px;padding:.2em}.json-schema-view .name,json-schema-view .name{color:#00f;display:table-cell;vertical-align:top}.json-schema-view .type,json-schema-view .type{color:green}.json-schema-view .type-any,json-schema-view .type-any{color:#33f}.json-schema-view .required,json-schema-view .required{color:red}.json-schema-view .inner,json-schema-view .inner{padding-left:18px}.json-schema-view.collapsed .description,.json-schema-view.collapsed .property,json-schema-view.collapsed .description,json-schema-view.collapsed .property{display:none}.json-schema-view.collapsed .closeing.brace,json-schema-view.collapsed .closeing.brace{display:inline-block}.json-schema-view.collapsed .toggle-handle,json-schema-view.collapsed .toggle-handle{transform:rotate(-90deg)}.json-schema-view.json-schema-view-dark,json-schema-view[json-schema-view-dark]{font-family:monospace;font-size:0;display:table-cell}.json-schema-view.json-schema-view-dark>*,json-schema-view[json-schema-view-dark]>*{font-size:14px}.json-schema-view.json-schema-view-dark .toggle-handle,json-schema-view[json-schema-view-dark] .toggle-handle{cursor:pointer;margin:auto .3em;font-size:10px;display:inline-block;transform-origin:50% 40%;transition:transform 150ms ease-in}.json-schema-view.json-schema-view-dark .toggle-handle,.json-schema-view.json-schema-view-dark .toggle-handle:hover,json-schema-view[json-schema-view-dark] .toggle-handle,json-schema-view[json-schema-view-dark] .toggle-handle:hover{text-decoration:none;color:#eee}.json-schema-view.json-schema-view-dark .description,json-schema-view[json-schema-view-dark] .description{color:gray;font-style:italic}.json-schema-view.json-schema-view-dark .title,.json-schema-view.json-schema-view-dark .title:hover,json-schema-view[json-schema-view-dark] .title,json-schema-view[json-schema-view-dark] .title:hover{text-decoration:none;color:#eee}.json-schema-view.json-schema-view-dark .brace,.json-schema-view.json-schema-view-dark .bracket,.json-schema-view.json-schema-view-dark .title,json-schema-view[json-schema-view-dark] .brace,json-schema-view[json-schema-view-dark] .bracket,json-schema-view[json-schema-view-dark] .title{color:#eee}.json-schema-view.json-schema-view-dark .property,json-schema-view[json-schema-view-dark] .property{font-size:0;display:table-row}.json-schema-view.json-schema-view-dark .property>*,json-schema-view[json-schema-view-dark] .property>*{font-size:14px;padding:.2em}.json-schema-view.json-schema-view-dark .name,json-schema-view[json-schema-view-dark] .name{color:#add8e6;display:table-cell;vertical-align:top}.json-schema-view.json-schema-view-dark .type,json-schema-view[json-schema-view-dark] .type{color:#90ee90}.json-schema-view.json-schema-view-dark .type-any,json-schema-view[json-schema-view-dark] .type-any{color:#d4ebf2}.json-schema-view.json-schema-view-dark .required,json-schema-view[json-schema-view-dark] .required{color:#fe0000}.json-schema-view.json-schema-view-dark .inner,json-schema-view[json-schema-view-dark] .inner{padding-left:18px}.json-schema-view.json-schema-view-dark.collapsed .description,.json-schema-view.json-schema-view-dark.collapsed .property,json-schema-view[json-schema-view-dark].collapsed .description,json-schema-view[json-schema-view-dark].collapsed .property{display:none}.json-schema-view.json-schema-view-dark.collapsed .closeing.brace,json-schema-view[json-schema-view-dark].collapsed .closeing.brace{display:inline-block}.json-schema-view.json-schema-view-dark.collapsed .toggle-handle,json-schema-view[json-schema-view-dark].collapsed .toggle-handle{transform:rotate(-90deg)}

  </style>
</head>
<body>
  <script>
    // Script section to load models into a JS Var
    var defs = {}
    defs.ActionRequest = {
  "type" : "object",
  "properties" : {
    "action_name" : {
      "type" : "string"
    },
    "action_type" : {
      "type" : "string"
    },
    "inputs" : {
      "type" : "string"
    },
    "target_service" : {
      "type" : "string"
    },
    "target_component" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    },
    "target_type" : {
      "type" : "string"
    },
    "default_timeout" : {
      "type" : "string"
    }
  }
};
    defs.ActionRequestSwagger = {
  "type" : "object",
  "properties" : {
    "Actions" : {
      "$ref" : "#/definitions/ActionRequest"
    }
  }
};
    defs.ActionResponse = {
  "type" : "object",
  "properties" : {
    "action_name" : {
      "type" : "string"
    },
    "action_type" : {
      "type" : "string"
    },
    "inputs" : {
      "type" : "string"
    },
    "target_service" : {
      "type" : "string"
    },
    "target_component" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    },
    "target_type" : {
      "type" : "string"
    },
    "default_timeout" : {
      "type" : "string"
    }
  }
};
    defs.ActionResponseSwagger = {
  "type" : "object",
  "properties" : {
    "Actions" : {
      "$ref" : "#/definitions/ActionResponse"
    }
  }
};
    defs.ActiveWidgetLayoutRequest = {
  "type" : "object",
  "properties" : {
    "WidgetLayouts" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/WidgetLayoutIdWrapper"
      }
    }
  }
};
    defs.ActiveWidgetLayoutResponse = {
  "type" : "object",
  "properties" : {
    "WidgetLayoutInfo/cluster_name" : {
      "type" : "string"
    },
    "WidgetLayoutInfo/display_name" : {
      "type" : "string"
    },
    "WidgetLayoutInfo/layout_name" : {
      "type" : "string"
    },
    "WidgetLayoutInfo/scope" : {
      "type" : "string"
    },
    "WidgetLayoutInfo/section_name" : {
      "type" : "string"
    },
    "WidgetLayoutInfo/user_name" : {
      "type" : "string"
    },
    "WidgetLayoutInfo/widgets" : {
      "type" : "array",
      "items" : {
        "type" : "object",
        "additionalProperties" : {
          "$ref" : "#/definitions/WidgetResponse"
        }
      }
    }
  }
};
    defs.AgentEnv = {
  "type" : "object",
  "properties" : {
    "stackFoldersAndFiles" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Directory"
      }
    },
    "alternatives" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Alternative"
      }
    },
    "existingUsers" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ExistingUser"
      }
    },
    "existingRepos" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "installedPackages" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/PackageDetail"
      }
    },
    "hostHealth" : {
      "$ref" : "#/definitions/HostHealth"
    },
    "umask" : {
      "type" : "integer",
      "format" : "int32"
    },
    "transparentHugePage" : {
      "type" : "string"
    },
    "firewallRunning" : {
      "type" : "boolean",
      "default" : false
    },
    "firewallName" : {
      "type" : "string"
    },
    "hasUnlimitedJcePolicy" : {
      "type" : "boolean",
      "default" : false
    },
    "reverseLookup" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.AlertGroup = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "cluster_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "default" : {
      "type" : "boolean",
      "default" : false
    },
    "id" : {
      "type" : "integer",
      "format" : "int64"
    }
  }
};
    defs.AlertTargetInfo = {
  "type" : "object",
  "properties" : {
    "enabled" : {
      "type" : "boolean",
      "default" : false
    },
    "description" : {
      "type" : "string"
    },
    "groups" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/AlertGroup"
      }
    },
    "notification_type" : {
      "type" : "string"
    },
    "alert_states" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "global" : {
      "type" : "boolean",
      "default" : false
    },
    "name" : {
      "type" : "string"
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "id" : {
      "type" : "integer",
      "format" : "int64"
    }
  }
};
    defs.AlertTargetSwagger = {
  "type" : "object",
  "properties" : {
    "AlertTarget" : {
      "$ref" : "#/definitions/AlertTargetInfo"
    }
  }
};
    defs.Alternative = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "target" : {
      "type" : "string"
    }
  }
};
    defs.Artifacts = {
  "type" : "object",
  "properties" : {
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "stack_name" : {
      "type" : "string"
    },
    "artifact_name" : {
      "type" : "string"
    }
  }
};
    defs.BatchRequest = {
  "type" : "object",
  "properties" : {
    "requests" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/BatchRequestRequest"
      }
    },
    "batch_settings" : {
      "$ref" : "#/definitions/BatchSettings"
    }
  }
};
    defs.BatchRequestRequest = {
  "type" : "object",
  "properties" : {
    "RequestBodyInfo" : {
      "$ref" : "#/definitions/RequestBodyInfo"
    },
    "uri" : {
      "type" : "string"
    },
    "order_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "type" : {
      "type" : "string"
    }
  }
};
    defs.BatchRequestResponse = {
  "type" : "object",
  "properties" : {
    "request_status" : {
      "type" : "string"
    },
    "request_body" : {
      "type" : "string"
    },
    "request_uri" : {
      "type" : "string"
    },
    "return_code" : {
      "type" : "integer",
      "format" : "int32"
    },
    "response_message" : {
      "type" : "string"
    },
    "order_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "request_type" : {
      "type" : "string"
    }
  }
};
    defs.BatchResponse = {
  "type" : "object",
  "properties" : {
    "batch_requests" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/BatchRequestResponse"
      }
    },
    "batch_settings" : {
      "$ref" : "#/definitions/BatchSettings"
    }
  }
};
    defs.BatchSettings = {
  "type" : "object",
  "properties" : {
    "batch_separation_in_seconds" : {
      "type" : "integer",
      "format" : "int32"
    },
    "task_failure_tolerance_limit" : {
      "type" : "integer",
      "format" : "int32"
    }
  }
};
    defs.BlueprintInfo = {
  "type" : "object",
  "properties" : {
    "security" : {
      "$ref" : "#/definitions/SecurityInfo"
    },
    "stack_version" : {
      "type" : "string"
    },
    "stack_name" : {
      "type" : "string"
    },
    "blueprint_name" : {
      "type" : "string"
    }
  }
};
    defs.BlueprintSwagger = {
  "type" : "object",
  "properties" : {
    "configurations" : {
      "type" : "array",
      "items" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "object",
          "properties" : { }
        }
      }
    },
    "Blueprints" : {
      "$ref" : "#/definitions/BlueprintInfo"
    },
    "host_groups" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/HostGroupInfo"
      }
    }
  }
};
    defs.Body = {
  "type" : "object",
  "properties" : {
    "Requests" : {
      "$ref" : "#/definitions/Request"
    }
  }
};
    defs.Check = {
  "type" : "object",
  "properties" : {
    "property" : {
      "type" : "string"
    },
    "desired" : {
      "type" : "string"
    },
    "site" : {
      "type" : "string"
    }
  }
};
    defs.ClusterArtifactRequest = {
  "type" : "object",
  "properties" : {
    "artifact_data" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    },
    "Artifacts" : {
      "$ref" : "#/definitions/ClusterArtifactRequestInfo"
    }
  }
};
    defs.ClusterArtifactRequestInfo = {
  "type" : "object",
  "properties" : {
    "artifact_name" : {
      "type" : "string"
    }
  }
};
    defs.ClusterArtifactResponse = {
  "type" : "object",
  "properties" : {
    "artifact_data" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    },
    "Artifacts" : {
      "$ref" : "#/definitions/ClusterArtifactResponseInfo"
    }
  }
};
    defs.ClusterArtifactResponseInfo = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "artifact_name" : {
      "type" : "string"
    }
  }
};
    defs.ClusterHealthReport = {
  "type" : "object",
  "properties" : {
    "Host/stale_config" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/maintenance_state" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_state/HEALTHY" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_state/UNHEALTHY" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_state/HEARTBEAT_LOST" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_state/INIT" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_status/HEALTHY" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_status/UNHEALTHY" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_status/UNKNOWN" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_status/ALERT" : {
      "type" : "integer",
      "format" : "int32"
    }
  }
};
    defs.ClusterRequest = {
  "type" : "object",
  "properties" : {
    "cluster_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "cluster_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "provisioning_state" : {
      "type" : "string"
    },
    "security_type" : {
      "type" : "string",
      "enum" : [ "NONE", "KERBEROS" ]
    },
    "desired_service_config_versions" : {
      "$ref" : "#/definitions/ServiceConfigVersionRequest"
    },
    "desired_configs" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ConfigurationRequest"
      }
    }
  }
};
    defs.ClusterRequestSwagger = {
  "type" : "object",
  "properties" : {
    "Clusters" : {
      "$ref" : "#/definitions/ClusterRequest"
    }
  }
};
    defs.ClusterResponse = {
  "type" : "object",
  "properties" : {
    "cluster_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "cluster_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "provisioning_state" : {
      "type" : "string",
      "enum" : [ "INIT", "INSTALLING", "INSTALL_FAILED", "INSTALLED", "STARTING", "STARTED", "STOPPING", "UNINSTALLING", "UNINSTALLED", "WIPING_OUT", "UPGRADING", "DISABLED", "UNKNOWN" ]
    },
    "security_type" : {
      "type" : "string",
      "enum" : [ "NONE", "KERBEROS" ]
    },
    "total_hosts" : {
      "type" : "integer",
      "format" : "int32"
    },
    "desired_configs" : {
      "type" : "object",
      "additionalProperties" : {
        "$ref" : "#/definitions/DesiredConfig"
      }
    },
    "desired_service_config_versions" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "array",
        "items" : {
          "$ref" : "#/definitions/ServiceConfigVersionResponse"
        }
      }
    },
    "health_report" : {
      "$ref" : "#/definitions/ClusterHealthReport"
    },
    "credential_store_properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    }
  }
};
    defs.ClusterResponseWrapper = {
  "type" : "object",
  "properties" : {
    "Clusters" : {
      "$ref" : "#/definitions/ClusterResponse"
    }
  }
};
    defs.ClusterServiceArtifactRequest = {
  "type" : "object",
  "properties" : {
    "artifact_data" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    },
    "Artifacts" : {
      "$ref" : "#/definitions/ClusterServiceArtifactRequestInfo"
    }
  }
};
    defs.ClusterServiceArtifactRequestInfo = {
  "type" : "object",
  "properties" : {
    "artifact_name" : {
      "type" : "string"
    }
  }
};
    defs.ClusterServiceArtifactResponse = {
  "type" : "object",
  "properties" : {
    "artifact_data" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    },
    "Artifacts" : {
      "$ref" : "#/definitions/ClusterServiceArtifactResponseInfo"
    }
  }
};
    defs.ClusterServiceArtifactResponseInfo = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "artifact_name" : {
      "type" : "string"
    }
  }
};
    defs.ComponentDependencyResponse = {
  "type" : "object",
  "properties" : {
    "Dependencies" : {
      "$ref" : "#/definitions/ComponentDependencyResponseInfo"
    }
  }
};
    defs.ComponentDependencyResponseInfo = {
  "type" : "object",
  "properties" : {
    "scope" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "component_name" : {
      "type" : "string"
    },
    "stack_name" : {
      "type" : "string"
    },
    "conditions" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/DependencyConditionInfo"
      }
    },
    "dependent_component_name" : {
      "type" : "string"
    },
    "dependent_service_name" : {
      "type" : "string"
    }
  }
};
    defs.ComponentInfo = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "provision_action" : {
      "type" : "string"
    }
  }
};
    defs.ComponentRecoveryReport = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "numAttempts" : {
      "type" : "integer",
      "format" : "int32"
    },
    "limitReached" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.Config = {
  "type" : "object",
  "properties" : {
    "version" : {
      "type" : "integer",
      "format" : "int64"
    },
    "tag" : {
      "type" : "string"
    },
    "serviceConfigVersions" : {
      "type" : "array",
      "items" : {
        "type" : "integer",
        "format" : "int64"
      }
    },
    "stackId" : {
      "$ref" : "#/definitions/StackId"
    },
    "propertiesTypes" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "array",
        "uniqueItems" : true,
        "items" : {
          "type" : "string"
        }
      }
    },
    "propertiesAttributes" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "string"
        }
      }
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "type" : {
      "type" : "string"
    }
  }
};
    defs.ConfigCondition = {
  "type" : "object",
  "properties" : {
    "configs" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "resource" : {
      "type" : "string"
    },
    "if" : {
      "type" : "string"
    },
    "then" : {
      "$ref" : "#/definitions/ConfigConditionResult"
    },
    "else" : {
      "$ref" : "#/definitions/ConfigConditionResult"
    }
  }
};
    defs.ConfigConditionResult = {
  "type" : "object",
  "properties" : {
    "property_value_attributes" : {
      "$ref" : "#/definitions/ValueAttributesInfo"
    }
  }
};
    defs.ConfigGroupRequest = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "cluster_name" : {
      "type" : "string"
    },
    "group_name" : {
      "type" : "string"
    },
    "tag" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    },
    "service_config_version_note" : {
      "type" : "string"
    },
    "hosts" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "string"
      }
    },
    "desired_configs" : {
      "type" : "object",
      "additionalProperties" : {
        "$ref" : "#/definitions/Config"
      }
    }
  }
};
    defs.ConfigGroupResponse = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "cluster_name" : {
      "type" : "string"
    },
    "group_name" : {
      "type" : "string"
    },
    "tag" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    },
    "hosts" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "object",
          "properties" : { }
        }
      }
    },
    "version_tags" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "object",
          "properties" : { }
        }
      }
    },
    "desired_configs" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "object",
          "properties" : { }
        }
      }
    }
  }
};
    defs.ConfigGroupWrapper = {
  "type" : "object",
  "properties" : {
    "ConfigGroup" : {
      "$ref" : "#/definitions/ConfigGroupResponse"
    }
  }
};
    defs.ConfigPlacement = {
  "type" : "object",
  "properties" : {
    "config" : {
      "type" : "string"
    },
    "subsection-name" : {
      "type" : "string"
    },
    "subsection-tab-name" : {
      "type" : "string"
    },
    "property_value_attributes" : {
      "$ref" : "#/definitions/ValueAttributesInfo"
    },
    "depends-on" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ConfigCondition"
      }
    },
    "removed" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.ConfigurationRequest = {
  "type" : "object",
  "properties" : {
    "Config/cluster_name" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string"
    },
    "version" : {
      "type" : "integer",
      "format" : "int64"
    },
    "tag" : {
      "type" : "string"
    },
    "properties_attributes" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "string"
        }
      }
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    }
  }
};
    defs.ConfigurationResponse = {
  "type" : "object",
  "properties" : {
    "Config/cluster_name" : {
      "type" : "string"
    },
    "Config/stack_id" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string"
    },
    "tag" : {
      "type" : "string"
    },
    "version" : {
      "type" : "integer",
      "format" : "int64"
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "properties_attributes" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "string"
        }
      }
    }
  }
};
    defs.CreateUserAuthenticationSourceInfo = {
  "type" : "object",
  "required" : [ "authentication_type", "key" ],
  "properties" : {
    "authentication_type" : {
      "type" : "string",
      "enum" : [ "LOCAL", "LDAP", "JWT", "PAM", "KERBEROS" ]
    },
    "key" : {
      "type" : "string"
    }
  }
};
    defs.CreateUserInfo = {
  "type" : "object",
  "properties" : {
    "active" : {
      "type" : "boolean",
      "default" : false
    },
    "password" : {
      "type" : "string"
    },
    "admin" : {
      "type" : "boolean",
      "default" : false
    },
    "local_user_name" : {
      "type" : "string"
    },
    "display_name" : {
      "type" : "string"
    }
  }
};
    defs.CreateUsersInfo = {
  "type" : "object",
  "properties" : {
    "active" : {
      "type" : "boolean",
      "default" : false
    },
    "user_name" : {
      "type" : "string"
    },
    "password" : {
      "type" : "string"
    },
    "admin" : {
      "type" : "boolean",
      "default" : false
    },
    "local_user_name" : {
      "type" : "string"
    },
    "display_name" : {
      "type" : "string"
    }
  }
};
    defs.DependencyConditionInfo = {
  "type" : "object"
};
    defs.DesiredConfig = {
  "type" : "object",
  "properties" : {
    "tag" : {
      "type" : "string"
    },
    "serviceName" : {
      "type" : "string"
    },
    "version" : {
      "type" : "integer",
      "format" : "int64"
    },
    "hostOverrides" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/HostOverride"
      }
    }
  }
};
    defs.Directory = {
  "type" : "object",
  "properties" : {
    "type" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    }
  }
};
    defs.DiskInfo = {
  "type" : "object",
  "properties" : {
    "available" : {
      "type" : "string"
    },
    "device" : {
      "type" : "string"
    },
    "used" : {
      "type" : "string"
    },
    "percent" : {
      "type" : "string"
    },
    "size" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string"
    },
    "mountpoint" : {
      "type" : "string"
    }
  }
};
    defs.ExistingUser = {
  "type" : "object",
  "properties" : {
    "userName" : {
      "type" : "string"
    },
    "userHomeDir" : {
      "type" : "string"
    },
    "userStatus" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    },
    "homeDir" : {
      "type" : "string"
    },
    "status" : {
      "type" : "string"
    }
  }
};
    defs.ExtensionLinkResponse = {
  "type" : "object",
  "properties" : {
    "ExtensionLink" : {
      "$ref" : "#/definitions/ExtensionLinkResponseInfo"
    }
  }
};
    defs.ExtensionLinkResponseInfo = {
  "type" : "object",
  "properties" : {
    "link_id" : {
      "type" : "string"
    },
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "extension_name" : {
      "type" : "string"
    },
    "extension_version" : {
      "type" : "string"
    }
  }
};
    defs.GroupPrivilegeResponse = {
  "type" : "object",
  "required" : [ "PrivilegeInfo/group_name" ],
  "properties" : {
    "permission_label" : {
      "type" : "string"
    },
    "privilege_id" : {
      "type" : "integer",
      "format" : "int32"
    },
    "permission_name" : {
      "type" : "string"
    },
    "principal_type" : {
      "type" : "string",
      "enum" : [ "USER", "GROUP", "ROLE" ]
    },
    "principal_name" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string",
      "enum" : [ "AMBARI", "CLUSTER", "VIEW" ]
    },
    "cluster_name" : {
      "type" : "string"
    },
    "view_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "instance_name" : {
      "type" : "string"
    },
    "PrivilegeInfo/group_name" : {
      "type" : "string"
    }
  }
};
    defs.GroupRequest = {
  "type" : "object",
  "required" : [ "Groups/group_name" ],
  "properties" : {
    "Groups/group_name" : {
      "type" : "string"
    }
  }
};
    defs.GroupResponse = {
  "type" : "object",
  "properties" : {
    "Groups/group_name" : {
      "type" : "string"
    },
    "Groups/ldap_group" : {
      "type" : "boolean",
      "default" : false
    },
    "Groups/group_type" : {
      "type" : "string",
      "enum" : [ "LOCAL", "LDAP", "JWT", "PAM" ]
    }
  }
};
    defs.Host = {
  "type" : "object",
  "properties" : {
    "httpProperty" : {
      "type" : "string"
    },
    "httpsProperty" : {
      "type" : "string"
    },
    "site" : {
      "type" : "string"
    }
  }
};
    defs.HostComponentComponent = {
  "type" : "object",
  "properties" : {
    "href" : {
      "type" : "string"
    },
    "ServiceComponentInfo" : {
      "$ref" : "#/definitions/HostComponentServiceComponentInfo"
    }
  }
};
    defs.HostComponentHost = {
  "type" : "object",
  "properties" : {
    "href" : {
      "type" : "string"
    }
  }
};
    defs.HostComponentMetrics = {
  "type" : "object"
};
    defs.HostComponentProcessResponse = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "host_name" : {
      "type" : "string"
    },
    "component_name" : {
      "type" : "string"
    },
    "valueMap" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    }
  }
};
    defs.HostComponentProcesses = {
  "type" : "object"
};
    defs.HostComponentServiceComponentInfo = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "component_name" : {
      "type" : "string"
    }
  }
};
    defs.HostComponentSwagger = {
  "type" : "object",
  "properties" : {
    "component" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/HostComponentComponent"
      }
    },
    "processes" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/HostComponentProcesses"
      }
    },
    "HostRoles" : {
      "$ref" : "#/definitions/ServiceComponentHostResponse"
    },
    "metrics" : {
      "$ref" : "#/definitions/HostComponentMetrics"
    },
    "host" : {
      "$ref" : "#/definitions/HostComponentHost"
    }
  }
};
    defs.HostConfig = {
  "type" : "object",
  "properties" : {
    "configGroupOverrides" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "defaultVersionTag" : {
      "type" : "string"
    }
  }
};
    defs.HostGroupInfo = {
  "type" : "object",
  "properties" : {
    "components" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ComponentInfo"
      }
    },
    "configurations" : {
      "type" : "array",
      "items" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "object",
          "properties" : { }
        }
      }
    },
    "cardinality" : {
      "type" : "integer",
      "format" : "int32"
    },
    "name" : {
      "type" : "string"
    }
  }
};
    defs.HostHealth = {
  "type" : "object",
  "properties" : {
    "activeJavaProcs" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/JavaProc"
      }
    },
    "agentTimeStampAtReporting" : {
      "type" : "integer",
      "format" : "int64"
    },
    "serverTimeStampAtReporting" : {
      "type" : "integer",
      "format" : "int64"
    },
    "liveServices" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/LiveService"
      }
    }
  }
};
    defs.HostOverride = {
  "type" : "object",
  "properties" : {
    "versionTag" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    }
  }
};
    defs.HostRequest = {
  "type" : "object",
  "properties" : {
    "host_name" : {
      "type" : "string"
    },
    "rack_info" : {
      "type" : "string"
    },
    "desired_configs" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ConfigurationRequest"
      }
    },
    "maintenance_state" : {
      "type" : "string"
    },
    "public_host_name" : {
      "type" : "string"
    },
    "host_group" : {
      "type" : "string"
    },
    "blueprint" : {
      "type" : "string"
    }
  }
};
    defs.HostResponse = {
  "type" : "object",
  "properties" : {
    "host_name" : {
      "type" : "string"
    },
    "cluster_name" : {
      "type" : "string"
    },
    "ip" : {
      "type" : "string"
    },
    "cpu_count" : {
      "type" : "integer",
      "format" : "int64"
    },
    "ph_cpu_count" : {
      "type" : "integer",
      "format" : "int64"
    },
    "os_arch" : {
      "type" : "string"
    },
    "os_family" : {
      "type" : "string"
    },
    "os_type" : {
      "type" : "string"
    },
    "total_mem" : {
      "type" : "integer",
      "format" : "int64"
    },
    "disk_info" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/DiskInfo"
      }
    },
    "last_heartbeat_time" : {
      "type" : "integer",
      "format" : "int64"
    },
    "last_agent_env" : {
      "$ref" : "#/definitions/AgentEnv"
    },
    "last_registration_time" : {
      "type" : "integer",
      "format" : "int64"
    },
    "rack_info" : {
      "type" : "string"
    },
    "recovery_report" : {
      "$ref" : "#/definitions/RecoveryReport"
    },
    "recovery_summary" : {
      "type" : "string"
    },
    "host_state" : {
      "type" : "string",
      "enum" : [ "INIT", "WAITING_FOR_HOST_STATUS_UPDATES", "HEALTHY", "HEARTBEAT_LOST", "UNHEALTHY" ]
    },
    "desired_configs" : {
      "type" : "object",
      "additionalProperties" : {
        "$ref" : "#/definitions/HostConfig"
      }
    },
    "host_status" : {
      "type" : "string"
    },
    "maintenance_state" : {
      "type" : "string",
      "enum" : [ "OFF", "ON", "IMPLIED_FROM_SERVICE", "IMPLIED_FROM_HOST", "IMPLIED_FROM_SERVICE_AND_HOST" ]
    },
    "host_health_report" : {
      "type" : "string"
    },
    "public_host_name" : {
      "type" : "string"
    }
  }
};
    defs.HostResponseWrapper = {
  "type" : "object",
  "properties" : {
    "Hosts" : {
      "$ref" : "#/definitions/HostResponse"
    }
  }
};
    defs.JavaProc = {
  "type" : "object",
  "properties" : {
    "hadoop" : {
      "type" : "boolean",
      "default" : false
    },
    "user" : {
      "type" : "string"
    },
    "pid" : {
      "type" : "integer",
      "format" : "int32"
    },
    "command" : {
      "type" : "string"
    }
  }
};
    defs.Layout = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "tabs" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Tab"
      }
    }
  }
};
    defs.Link = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "label" : {
      "type" : "string"
    },
    "componentName" : {
      "type" : "string"
    },
    "requiresUserName" : {
      "type" : "string"
    },
    "url" : {
      "type" : "string"
    },
    "port" : {
      "$ref" : "#/definitions/Port"
    },
    "host" : {
      "$ref" : "#/definitions/Host"
    },
    "protocol" : {
      "$ref" : "#/definitions/Protocol"
    },
    "attributes" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "visible" : {
      "type" : "boolean",
      "default" : false
    },
    "removed" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.LiveService = {
  "type" : "object",
  "properties" : {
    "status" : {
      "type" : "string"
    },
    "desc" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    }
  }
};
    defs.MemberRequest = {
  "type" : "object",
  "required" : [ "MemberInfo/group_name", "MemberInfo/user_name" ],
  "properties" : {
    "MemberInfo/group_name" : {
      "type" : "string"
    },
    "MemberInfo/user_name" : {
      "type" : "string"
    }
  }
};
    defs.MemberResponse = {
  "type" : "object",
  "properties" : {
    "MemberInfo/group_name" : {
      "type" : "string"
    },
    "MemberInfo/user_name" : {
      "type" : "string"
    }
  }
};
    defs.OperationLevel = {
  "type" : "object",
  "properties" : {
    "level" : {
      "type" : "string"
    },
    "cluster_name" : {
      "type" : "string"
    }
  }
};
    defs.Os = {
  "type" : "object",
  "properties" : {
    "family" : {
      "type" : "string",
      "xml" : {
        "attribute" : true
      }
    },
    "packageVersion" : {
      "type" : "string",
      "xml" : {
        "name" : "package-version"
      }
    },
    "repos" : {
      "type" : "array",
      "xml" : {
        "name" : "repo"
      },
      "items" : {
        "$ref" : "#/definitions/Repo"
      }
    }
  }
};
    defs.PackageDetail = {
  "type" : "object",
  "properties" : {
    "version" : {
      "type" : "string"
    },
    "repoName" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    }
  }
};
    defs.ParameterConfig = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    },
    "label" : {
      "type" : "string"
    },
    "placeholder" : {
      "type" : "string"
    },
    "defaultValue" : {
      "type" : "string",
      "xml" : {
        "name" : "default-value"
      }
    },
    "clusterConfig" : {
      "type" : "string",
      "xml" : {
        "name" : "cluster-config"
      }
    },
    "required" : {
      "type" : "boolean",
      "default" : false
    },
    "masked" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.Placement = {
  "type" : "object",
  "properties" : {
    "configs" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ConfigPlacement"
      }
    },
    "configurationLayout" : {
      "type" : "string"
    }
  }
};
    defs.Port = {
  "type" : "object",
  "properties" : {
    "httpProperty" : {
      "type" : "string"
    },
    "httpDefaultPort" : {
      "type" : "string"
    },
    "httpsProperty" : {
      "type" : "string"
    },
    "httpsDefaultPort" : {
      "type" : "string"
    },
    "regex" : {
      "type" : "string"
    },
    "httpsRegex" : {
      "type" : "string"
    },
    "site" : {
      "type" : "string"
    }
  }
};
    defs.PrivilegeResponse = {
  "type" : "object",
  "properties" : {
    "permission_label" : {
      "type" : "string"
    },
    "privilege_id" : {
      "type" : "integer",
      "format" : "int32"
    },
    "permission_name" : {
      "type" : "string"
    },
    "principal_type" : {
      "type" : "string",
      "enum" : [ "USER", "GROUP", "ROLE" ]
    },
    "principal_name" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string",
      "enum" : [ "AMBARI", "CLUSTER", "VIEW" ]
    },
    "cluster_name" : {
      "type" : "string"
    },
    "view_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "instance_name" : {
      "type" : "string"
    }
  }
};
    defs.PropertyDependencyInfo = {
  "type" : "object",
  "properties" : {
    "type" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    }
  }
};
    defs.Protocol = {
  "type" : "object",
  "properties" : {
    "type" : {
      "type" : "string"
    },
    "checks" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Check"
      }
    }
  }
};
    defs.QuickLinksConfiguration = {
  "type" : "object",
  "properties" : {
    "protocol" : {
      "$ref" : "#/definitions/Protocol"
    },
    "links" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Link"
      }
    }
  }
};
    defs.QuickLinksResponse = {
  "type" : "object",
  "properties" : {
    "QuickLinkInfo" : {
      "$ref" : "#/definitions/QuickLinksResponseInfo"
    }
  }
};
    defs.QuickLinksResponseInfo = {
  "type" : "object",
  "properties" : {
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "stack_name" : {
      "type" : "string"
    },
    "quicklink_data" : {
      "$ref" : "#/definitions/QuickLinksConfiguration"
    },
    "default" : {
      "type" : "boolean",
      "default" : false
    },
    "file_name" : {
      "type" : "string"
    }
  }
};
    defs.RecoveryReport = {
  "type" : "object",
  "properties" : {
    "summary" : {
      "type" : "string"
    },
    "component_reports" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ComponentRecoveryReport"
      }
    }
  }
};
    defs.Release = {
  "type" : "object",
  "properties" : {
    "repositoryType" : {
      "type" : "string",
      "xml" : {
        "name" : "type"
      },
      "enum" : [ "STANDARD", "PATCH", "MAINT", "SERVICE" ]
    },
    "stackId" : {
      "type" : "string",
      "xml" : {
        "name" : "stack-id"
      }
    },
    "version" : {
      "type" : "string"
    },
    "build" : {
      "type" : "string"
    },
    "compatibleWith" : {
      "type" : "string",
      "xml" : {
        "name" : "compatible-with"
      }
    },
    "releaseNotes" : {
      "type" : "string",
      "xml" : {
        "name" : "release-notes"
      }
    },
    "display" : {
      "type" : "string"
    },
    "fullVersion" : {
      "type" : "string"
    }
  }
};
    defs.Repo = {
  "type" : "object",
  "properties" : {
    "distribution" : {
      "type" : "string"
    },
    "components" : {
      "type" : "string"
    },
    "unique" : {
      "type" : "boolean",
      "default" : false
    },
    "tags" : {
      "type" : "array",
      "xml" : {
        "name" : "tag",
        "wrapped" : true
      },
      "uniqueItems" : true,
      "items" : {
        "type" : "string",
        "enum" : [ "GPL" ]
      }
    },
    "repoName" : {
      "type" : "string"
    },
    "baseUrl" : {
      "type" : "string"
    },
    "mirrorsList" : {
      "type" : "string"
    },
    "repoId" : {
      "type" : "string"
    }
  }
};
    defs.RepoDefinitionEntity = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "repoOs" : {
      "$ref" : "#/definitions/RepoOsEntity"
    },
    "repoName" : {
      "type" : "string"
    },
    "repoID" : {
      "type" : "string"
    },
    "baseUrl" : {
      "type" : "string"
    },
    "mirrors" : {
      "type" : "string"
    },
    "distribution" : {
      "type" : "string"
    },
    "components" : {
      "type" : "string"
    },
    "unique" : {
      "type" : "boolean",
      "default" : false
    },
    "applicableServices" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "tags" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "string",
        "enum" : [ "GPL" ]
      }
    }
  }
};
    defs.RepoOsEntity = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "family" : {
      "type" : "string"
    },
    "ambariManaged" : {
      "type" : "boolean",
      "default" : false
    },
    "repoDefinitionEntities" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RepoDefinitionEntity"
      }
    },
    "repositoryVersionEntity" : {
      "$ref" : "#/definitions/RepositoryVersionEntity"
    }
  }
};
    defs.RepositoryInfo = {
  "type" : "object",
  "properties" : {
    "baseUrl" : {
      "type" : "string"
    },
    "osType" : {
      "type" : "string"
    },
    "repoId" : {
      "type" : "string"
    },
    "repoName" : {
      "type" : "string"
    },
    "distribution" : {
      "type" : "string"
    },
    "components" : {
      "type" : "string"
    },
    "mirrorsList" : {
      "type" : "string"
    },
    "defaultBaseUrl" : {
      "type" : "string"
    },
    "repoSaved" : {
      "type" : "boolean",
      "default" : false
    },
    "unique" : {
      "type" : "boolean",
      "default" : false
    },
    "ambariManagedRepositories" : {
      "type" : "boolean",
      "default" : false
    },
    "applicableServices" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "tags" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "string",
        "enum" : [ "GPL" ]
      }
    }
  }
};
    defs.RepositoryVersionEntity = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "stack" : {
      "$ref" : "#/definitions/StackEntity"
    },
    "version" : {
      "type" : "string"
    },
    "displayName" : {
      "type" : "string"
    },
    "repoOsEntities" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RepoOsEntity"
      }
    },
    "type" : {
      "type" : "string",
      "enum" : [ "STANDARD", "PATCH", "MAINT", "SERVICE" ]
    },
    "versionXml" : {
      "type" : "string"
    },
    "versionUrl" : {
      "type" : "string"
    },
    "versionXsd" : {
      "type" : "string"
    },
    "resolved" : {
      "type" : "boolean",
      "default" : false
    },
    "children" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RepositoryVersionEntity"
      }
    },
    "stackVersion" : {
      "type" : "string"
    },
    "stackId" : {
      "$ref" : "#/definitions/StackId"
    },
    "stackName" : {
      "type" : "string"
    },
    "repositoryXml" : {
      "$ref" : "#/definitions/VersionDefinitionXml"
    },
    "hidden" : {
      "type" : "boolean",
      "default" : false
    },
    "legacy" : {
      "type" : "boolean",
      "default" : false
    },
    "parentId" : {
      "type" : "integer",
      "format" : "int64"
    }
  }
};
    defs.RepositoryXml = {
  "type" : "object",
  "properties" : {
    "oses" : {
      "type" : "array",
      "xml" : {
        "name" : "os"
      },
      "items" : {
        "$ref" : "#/definitions/Os"
      }
    },
    "valid" : {
      "type" : "boolean",
      "default" : false
    },
    "errors" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "repositories" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RepositoryInfo"
      }
    },
    "latestURI" : {
      "type" : "string"
    }
  },
  "xml" : {
    "name" : "reposinfo"
  }
};
    defs.Request = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "exclusive" : {
      "type" : "boolean",
      "default" : false
    },
    "resource_filters" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RequestResourceFilter"
      }
    }
  }
};
    defs.RequestBodyInfo = {
  "type" : "object",
  "properties" : {
    "RequestInfo" : {
      "$ref" : "#/definitions/RequestInfo"
    },
    "Requests/resource_filters" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RequestResourceFilter"
      }
    }
  }
};
    defs.RequestInfo = {
  "type" : "object",
  "properties" : {
    "command" : {
      "type" : "string"
    },
    "action" : {
      "type" : "string"
    },
    "operation_level" : {
      "$ref" : "#/definitions/OperationLevel"
    },
    "parameters" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    }
  }
};
    defs.RequestPostRequest = {
  "type" : "object",
  "properties" : {
    "Body" : {
      "$ref" : "#/definitions/Body"
    },
    "RequestInfo" : {
      "$ref" : "#/definitions/RequestInfo"
    }
  }
};
    defs.RequestPostResponse = {
  "type" : "object",
  "properties" : {
    "Requests" : {
      "$ref" : "#/definitions/ShortRequestInfo"
    }
  }
};
    defs.RequestPutRequest = {
  "type" : "object",
  "properties" : {
    "Requests" : {
      "$ref" : "#/definitions/RequestRequest"
    }
  }
};
    defs.RequestRequest = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "request_status" : {
      "type" : "string",
      "enum" : [ "PENDING", "QUEUED", "IN_PROGRESS", "HOLDING", "COMPLETED", "FAILED", "HOLDING_FAILED", "TIMEDOUT", "HOLDING_TIMEDOUT", "ABORTED", "SKIPPED_FAILED" ]
    },
    "abort_reason" : {
      "type" : "string"
    },
    "removePendingHostRequests" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.RequestResourceFilter = {
  "type" : "object",
  "properties" : {
    "serviceName" : {
      "type" : "string"
    },
    "componentName" : {
      "type" : "string"
    },
    "hostNames" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    }
  }
};
    defs.RequestResponse = {
  "type" : "object",
  "properties" : {
    "Requests" : {
      "$ref" : "#/definitions/RequestStatusInfo"
    }
  }
};
    defs.RequestScheduleRequestElement = {
  "type" : "object",
  "properties" : {
    "schedule" : {
      "$ref" : "#/definitions/ScheduleRequest"
    },
    "batch" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/BatchRequest"
      }
    }
  }
};
    defs.RequestScheduleRequestSwagger = {
  "type" : "object",
  "properties" : {
    "RequestSchedule" : {
      "$ref" : "#/definitions/RequestScheduleRequestElement"
    }
  }
};
    defs.RequestScheduleResponseElement = {
  "type" : "object",
  "properties" : {
    "schedule" : {
      "$ref" : "#/definitions/ScheduleResponse"
    },
    "description" : {
      "type" : "string"
    },
    "status" : {
      "type" : "string"
    },
    "cluster_name" : {
      "type" : "string"
    },
    "create_time" : {
      "type" : "string"
    },
    "batch" : {
      "$ref" : "#/definitions/BatchResponse"
    },
    "create_user" : {
      "type" : "string"
    },
    "update_user" : {
      "type" : "string"
    },
    "update_time" : {
      "type" : "string"
    },
    "last_execution_status" : {
      "type" : "string"
    },
    "authenticated_user" : {
      "type" : "integer",
      "format" : "int32"
    },
    "id" : {
      "type" : "integer",
      "format" : "int64"
    }
  }
};
    defs.RequestScheduleResponseSwagger = {
  "type" : "object",
  "properties" : {
    "RequestSchedule" : {
      "$ref" : "#/definitions/RequestScheduleResponseElement"
    }
  }
};
    defs.RequestStatusInfo = {
  "type" : "object",
  "properties" : {
    "task_count" : {
      "type" : "integer",
      "format" : "int32"
    },
    "completed_task_count" : {
      "type" : "string"
    },
    "start_time" : {
      "type" : "string"
    },
    "request_context" : {
      "type" : "string"
    },
    "request_status" : {
      "type" : "string"
    },
    "request_schedule" : {
      "type" : "string"
    },
    "cluster_name" : {
      "type" : "string"
    },
    "create_time" : {
      "type" : "integer",
      "format" : "int64"
    },
    "id" : {
      "type" : "string"
    },
    "aborted_task_count" : {
      "type" : "integer",
      "format" : "int32"
    },
    "end_time" : {
      "type" : "string"
    },
    "exclusive" : {
      "type" : "boolean",
      "default" : false
    },
    "failed_task_count" : {
      "type" : "integer",
      "format" : "int32"
    },
    "inputs" : {
      "type" : "string"
    },
    "operation_level" : {
      "type" : "string"
    },
    "progress_percent" : {
      "type" : "number",
      "format" : "double"
    },
    "queued_task_count" : {
      "type" : "integer",
      "format" : "int32"
    },
    "request_schedule_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "resource_filters" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RequestResourceFilter"
      }
    },
    "type" : {
      "type" : "string"
    }
  }
};
    defs.RootServiceComponentConfigurationRequestInfo = {
  "type" : "object",
  "properties" : {
    "serviceName" : {
      "type" : "string"
    },
    "componentName" : {
      "type" : "string"
    },
    "categoryName" : {
      "type" : "string"
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    }
  }
};
    defs.RootServiceComponentConfigurationRequestSwagger = {
  "type" : "object",
  "properties" : {
    "Configuration" : {
      "$ref" : "#/definitions/RootServiceComponentConfigurationRequestInfo"
    }
  }
};
    defs.RootServiceComponentConfigurationResponseInfo = {
  "type" : "object",
  "properties" : {
    "serviceName" : {
      "type" : "string"
    },
    "componentName" : {
      "type" : "string"
    },
    "categoryName" : {
      "type" : "string"
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    }
  }
};
    defs.RootServiceComponentConfigurationResponseSwagger = {
  "type" : "object",
  "properties" : {
    "Configuration" : {
      "$ref" : "#/definitions/RootServiceComponentConfigurationResponseInfo"
    }
  }
};
    defs.RootServiceComponentResponse = {
  "type" : "object",
  "properties" : {
    "service_name" : {
      "type" : "string"
    },
    "component_name" : {
      "type" : "string"
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "component_version" : {
      "type" : "string"
    },
    "server_clock" : {
      "type" : "integer",
      "format" : "int64"
    }
  }
};
    defs.RootServiceComponentResponseWrapper = {
  "type" : "object",
  "properties" : {
    "RootServiceComponents" : {
      "$ref" : "#/definitions/RootServiceComponentResponse"
    }
  }
};
    defs.RootServiceComponentWithHostComponentList = {
  "type" : "object",
  "properties" : {
    "hostComponents" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RootServiceHostComponentResponseWrapper"
      }
    },
    "RootServiceComponents" : {
      "$ref" : "#/definitions/RootServiceComponentResponse"
    }
  }
};
    defs.RootServiceHostComponentResponse = {
  "type" : "object",
  "properties" : {
    "service_name" : {
      "type" : "string"
    },
    "host_name" : {
      "type" : "string"
    },
    "component_name" : {
      "type" : "string"
    },
    "component_state" : {
      "type" : "string"
    },
    "component_version" : {
      "type" : "string"
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    }
  }
};
    defs.RootServiceHostComponentResponseWrapper = {
  "type" : "object",
  "properties" : {
    "RootServiceHostComponents" : {
      "$ref" : "#/definitions/RootServiceHostComponentResponse"
    }
  }
};
    defs.RootServiceResponse = {
  "type" : "object",
  "properties" : {
    "service_name" : {
      "type" : "string"
    }
  }
};
    defs.RootServiceResponseWithComponentList = {
  "type" : "object",
  "properties" : {
    "components" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RootServiceComponentResponseWrapper"
      }
    },
    "RootService" : {
      "$ref" : "#/definitions/RootServiceResponse"
    }
  }
};
    defs.RootServiceResponseWrapper = {
  "type" : "object",
  "properties" : {
    "RootService" : {
      "$ref" : "#/definitions/RootServiceResponse"
    }
  }
};
    defs.ScheduleRequest = {
  "type" : "object",
  "properties" : {
    "year" : {
      "type" : "string"
    },
    "day_of_week" : {
      "type" : "string"
    },
    "month" : {
      "type" : "string"
    },
    "hours" : {
      "type" : "string"
    },
    "minutes" : {
      "type" : "string"
    },
    "startTime" : {
      "type" : "string"
    },
    "endTime" : {
      "type" : "string"
    },
    "days_of_month" : {
      "type" : "string"
    }
  }
};
    defs.ScheduleResponse = {
  "type" : "object",
  "properties" : {
    "year" : {
      "type" : "string"
    },
    "day_of_week" : {
      "type" : "string"
    },
    "month" : {
      "type" : "string"
    },
    "hours" : {
      "type" : "string"
    },
    "minutes" : {
      "type" : "string"
    },
    "start_time" : {
      "type" : "string"
    },
    "end_time" : {
      "type" : "string"
    },
    "days_of_month" : {
      "type" : "string"
    }
  }
};
    defs.Section = {
  "type" : "object",
  "properties" : {
    "subsections" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Subsection"
      }
    },
    "display-name" : {
      "type" : "string"
    },
    "row-index" : {
      "type" : "string"
    },
    "section-rows" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    },
    "column-span" : {
      "type" : "string"
    },
    "section-columns" : {
      "type" : "string"
    },
    "column-index" : {
      "type" : "string"
    },
    "row-span" : {
      "type" : "string"
    },
    "removed" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.SecurityInfo = {
  "type" : "object",
  "properties" : {
    "kerberos_descriptor" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    },
    "security_type" : {
      "type" : "string",
      "enum" : [ "NONE", "KERBEROS" ]
    },
    "kerberos_descriptor_reference" : {
      "type" : "string"
    }
  }
};
    defs.ServiceComponentHostResponse = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "component_name" : {
      "type" : "string"
    },
    "display_name" : {
      "type" : "string"
    },
    "public_host_name" : {
      "type" : "string"
    },
    "host_name" : {
      "type" : "string"
    },
    "actual_configs" : {
      "type" : "object",
      "additionalProperties" : {
        "$ref" : "#/definitions/HostConfig"
      }
    },
    "state" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "desired_stack_id" : {
      "type" : "string"
    },
    "desired_repository_version" : {
      "type" : "string"
    },
    "desired_state" : {
      "type" : "string"
    },
    "stale_configs" : {
      "type" : "boolean",
      "default" : false
    },
    "reload_configs" : {
      "type" : "boolean",
      "default" : false
    },
    "maintenance_state" : {
      "type" : "string"
    },
    "upgrade_state" : {
      "type" : "string",
      "enum" : [ "NONE", "COMPLETE", "IN_PROGRESS", "FAILED", "VERSION_MISMATCH" ]
    }
  }
};
    defs.ServiceConfigVersionRequest = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "service_config_version" : {
      "type" : "integer",
      "format" : "int64"
    },
    "createtime" : {
      "type" : "integer",
      "format" : "int64"
    },
    "appliedtime" : {
      "type" : "integer",
      "format" : "int64"
    },
    "user" : {
      "type" : "string"
    },
    "service_config_version_note" : {
      "type" : "string"
    },
    "is_current" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.ServiceConfigVersionResponse = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "service_config_version" : {
      "type" : "integer",
      "format" : "int64"
    },
    "createtime" : {
      "type" : "integer",
      "format" : "int64"
    },
    "group_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "group_name" : {
      "type" : "string"
    },
    "user" : {
      "type" : "string"
    },
    "service_config_version_note" : {
      "type" : "string"
    },
    "stack_id" : {
      "type" : "string"
    },
    "is_current" : {
      "type" : "boolean",
      "default" : false
    },
    "configurations" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ConfigurationResponse"
      }
    },
    "hosts" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "is_cluster_compatible" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.ServiceRequest = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "state" : {
      "type" : "string"
    },
    "maintenance_state" : {
      "type" : "string"
    },
    "credential_store_enabled" : {
      "type" : "string"
    },
    "credential_store_supporteds" : {
      "type" : "string"
    },
    "desiredRepositoryVersionId" : {
      "type" : "integer",
      "format" : "int64"
    },
    "resolvedRepository" : {
      "$ref" : "#/definitions/RepositoryVersionEntity"
    }
  }
};
    defs.ServiceRequestSwagger = {
  "type" : "object",
  "properties" : {
    "ServiceInfo" : {
      "$ref" : "#/definitions/ServiceRequest"
    }
  }
};
    defs.ServiceResponse = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "desiredRepositoryVersion" : {
      "type" : "string"
    },
    "desiredRepositoryVersionId" : {
      "type" : "integer",
      "format" : "int64"
    },
    "repositoryVersionState" : {
      "type" : "string",
      "enum" : [ "NOT_REQUIRED", "INSTALLING", "INSTALLED", "INSTALL_FAILED", "OUT_OF_SYNC", "CURRENT" ]
    },
    "state" : {
      "type" : "string"
    },
    "maintenance_state" : {
      "type" : "string"
    },
    "credential_store_supported" : {
      "type" : "boolean",
      "default" : false
    },
    "credential_store_enabled" : {
      "type" : "boolean",
      "default" : false
    },
    "sso_integration_supported" : {
      "type" : "boolean",
      "default" : false
    },
    "sso_integration_desired" : {
      "type" : "boolean",
      "default" : false
    },
    "sso_integration_enabled" : {
      "type" : "boolean",
      "default" : false
    },
    "sso_integration_requires_kerberos" : {
      "type" : "boolean",
      "default" : false
    },
    "kerberos_enabled" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.ServiceResponseSwagger = {
  "type" : "object",
  "properties" : {
    "ServiceInfo" : {
      "$ref" : "#/definitions/ServiceResponse"
    }
  }
};
    defs.SettingRequest = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "setting_type" : {
      "type" : "string"
    },
    "content" : {
      "type" : "string"
    }
  }
};
    defs.SettingRequestSwagger = {
  "type" : "object",
  "properties" : {
    "Settings" : {
      "$ref" : "#/definitions/SettingRequest"
    }
  }
};
    defs.SettingResponse = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "setting_type" : {
      "type" : "string"
    },
    "content" : {
      "type" : "string"
    },
    "updated_by" : {
      "type" : "string"
    },
    "update_timestamp" : {
      "type" : "integer",
      "format" : "int64"
    }
  }
};
    defs.SettingResponseWrapper = {
  "type" : "object",
  "properties" : {
    "Settings" : {
      "$ref" : "#/definitions/SettingResponse"
    }
  }
};
    defs.ShortRequestInfo = {
  "type" : "object",
  "properties" : {
    "status" : {
      "type" : "string"
    },
    "id" : {
      "type" : "integer",
      "format" : "int64"
    }
  }
};
    defs.StackArtifactResponse = {
  "type" : "object",
  "properties" : {
    "Artifacts" : {
      "$ref" : "#/definitions/Artifacts"
    },
    "artifact_data" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    }
  }
};
    defs.StackConfigurationDependencyResponse = {
  "type" : "object",
  "properties" : {
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "property_name" : {
      "type" : "string"
    },
    "dependency_name" : {
      "type" : "string"
    },
    "dependency_type" : {
      "type" : "string"
    }
  }
};
    defs.StackConfigurationDependencyResponseSwagger = {
  "type" : "object",
  "properties" : {
    "StackConfigurationDependency" : {
      "$ref" : "#/definitions/StackConfigurationDependencyResponse"
    }
  }
};
    defs.StackConfigurationResponse = {
  "type" : "object",
  "properties" : {
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "property_name" : {
      "type" : "string"
    },
    "property_value" : {
      "type" : "string"
    },
    "property_description" : {
      "type" : "string"
    },
    "property_display_name" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string"
    },
    "property_value_attributes" : {
      "$ref" : "#/definitions/ValueAttributesInfo"
    },
    "dependencies" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "$ref" : "#/definitions/PropertyDependencyInfo"
      }
    },
    "property_type" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "string",
        "enum" : [ "PASSWORD", "USER", "UID", "GROUP", "GID", "TEXT", "ADDITIONAL_USER_PROPERTY", "NOT_MANAGED_HDFS_PATH", "VALUE_FROM_PROPERTY_FILE", "KERBEROS_PRINCIPAL" ]
      }
    }
  }
};
    defs.StackConfigurationResponseSwagger = {
  "type" : "object",
  "properties" : {
    "StackConfigurations" : {
      "$ref" : "#/definitions/StackConfigurationResponse"
    }
  }
};
    defs.StackEntity = {
  "type" : "object",
  "properties" : {
    "stackId" : {
      "type" : "integer",
      "format" : "int64"
    },
    "stackName" : {
      "type" : "string"
    },
    "stackVersion" : {
      "type" : "string"
    }
  }
};
    defs.StackId = {
  "type" : "object",
  "properties" : {
    "stackName" : {
      "type" : "string"
    },
    "stackVersion" : {
      "type" : "string"
    },
    "stackId" : {
      "type" : "string"
    }
  }
};
    defs.StackResponse = {
  "type" : "object",
  "properties" : {
    "stack_name" : {
      "type" : "string"
    }
  }
};
    defs.StackResponseSwagger = {
  "type" : "object",
  "properties" : {
    "Stacks" : {
      "$ref" : "#/definitions/StackResponse"
    }
  }
};
    defs.StackServiceArtifactResponse = {
  "type" : "object",
  "properties" : {
    "Artifacts" : {
      "$ref" : "#/definitions/Artifacts"
    },
    "artifact_data" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    }
  }
};
    defs.StackServiceComponentResponse = {
  "type" : "object",
  "properties" : {
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "component_name" : {
      "type" : "string"
    },
    "display_name" : {
      "type" : "string"
    },
    "component_category" : {
      "type" : "string"
    },
    "cardinality" : {
      "type" : "string"
    },
    "advertise_version" : {
      "type" : "boolean",
      "default" : false
    },
    "rollingRestartSupported" : {
      "type" : "boolean",
      "default" : false
    },
    "customCommands" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "custom_commands" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "recovery_enabled" : {
      "type" : "boolean",
      "default" : false
    },
    "bulkCommandsDisplayName" : {
      "type" : "string"
    },
    "componentType" : {
      "type" : "string"
    },
    "is_master" : {
      "type" : "boolean",
      "default" : false
    },
    "bulk_commands_master_component_namen" : {
      "type" : "string"
    },
    "decommission_allowed" : {
      "type" : "boolean",
      "default" : false
    },
    "reassign_allowed" : {
      "type" : "boolean",
      "default" : false
    },
    "is_client" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.StackServiceComponentResponseSwagger = {
  "type" : "object",
  "properties" : {
    "StackServiceComponents" : {
      "$ref" : "#/definitions/StackServiceComponentResponse"
    }
  }
};
    defs.StackServiceResponse = {
  "type" : "object",
  "properties" : {
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "service_type" : {
      "type" : "string"
    },
    "display_name" : {
      "type" : "string"
    },
    "user_name" : {
      "type" : "string"
    },
    "comments" : {
      "type" : "string"
    },
    "service_version" : {
      "type" : "string"
    },
    "selection" : {
      "type" : "string",
      "enum" : [ "DEFAULT", "TECH_PREVIEW", "MANDATORY", "DEPRECATED" ]
    },
    "service_check_supported" : {
      "type" : "boolean",
      "default" : false
    },
    "custom_commands" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "config_types" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "object",
          "additionalProperties" : {
            "type" : "string"
          }
        }
      }
    },
    "required_services" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "credential_store_supported" : {
      "type" : "boolean",
      "default" : false
    },
    "credential_store_enabled" : {
      "type" : "boolean",
      "default" : false
    },
    "credential_store_required" : {
      "type" : "boolean",
      "default" : false
    },
    "sso_integration_supported" : {
      "type" : "boolean",
      "default" : false
    },
    "sso_integration_requires_kerberos" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.StackServiceResponseSwagger = {
  "type" : "object",
  "properties" : {
    "StackServices" : {
      "$ref" : "#/definitions/StackServiceResponse"
    }
  }
};
    defs.StackVersionResponse = {
  "type" : "object",
  "properties" : {
    "min_jdk" : {
      "type" : "string"
    },
    "max_jdk" : {
      "type" : "string"
    },
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "min_upgrade_version" : {
      "type" : "string"
    },
    "active" : {
      "type" : "boolean",
      "default" : false
    },
    "valid" : {
      "type" : "boolean",
      "default" : false
    },
    "parent_stack_version" : {
      "type" : "string"
    },
    "config_types" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "object",
          "additionalProperties" : {
            "type" : "string"
          }
        }
      }
    },
    "upgrade_packs" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "string"
      }
    },
    "stack-errors" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    }
  }
};
    defs.StackVersionResponseSwagger = {
  "type" : "object",
  "properties" : {
    "Versions" : {
      "$ref" : "#/definitions/StackVersionResponse"
    }
  }
};
    defs.Subsection = {
  "type" : "object",
  "properties" : {
    "row-index" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    },
    "display-name" : {
      "type" : "string"
    },
    "column-span" : {
      "type" : "string"
    },
    "row-span" : {
      "type" : "string"
    },
    "column-index" : {
      "type" : "string"
    },
    "border" : {
      "type" : "string"
    },
    "left-vertical-splitter" : {
      "type" : "boolean",
      "default" : false
    },
    "depends-on" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ConfigCondition"
      }
    },
    "subsection-tab" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/SubsectionTab"
      }
    },
    "removed" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.SubsectionTab = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "displayName" : {
      "type" : "string"
    },
    "dependsOn" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ConfigCondition"
      }
    }
  }
};
    defs.Tab = {
  "type" : "object",
  "properties" : {
    "display-name" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    },
    "layout" : {
      "$ref" : "#/definitions/TabLayout"
    }
  }
};
    defs.TabLayout = {
  "type" : "object",
  "properties" : {
    "tab-rows" : {
      "type" : "string"
    },
    "sections" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Section"
      }
    },
    "tab-columns" : {
      "type" : "string"
    }
  }
};
    defs.Theme = {
  "type" : "object",
  "properties" : {
    "description" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    },
    "configuration" : {
      "$ref" : "#/definitions/ThemeConfiguration"
    }
  }
};
    defs.ThemeConfiguration = {
  "type" : "object",
  "properties" : {
    "placement" : {
      "$ref" : "#/definitions/Placement"
    },
    "widgets" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/WidgetEntry"
      }
    },
    "layouts" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Layout"
      }
    }
  }
};
    defs.ThemeInfoResponse = {
  "type" : "object",
  "properties" : {
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "stack_name" : {
      "type" : "string"
    },
    "theme_data" : {
      "$ref" : "#/definitions/Theme"
    },
    "default" : {
      "type" : "boolean",
      "default" : false
    },
    "file_name" : {
      "type" : "string"
    }
  }
};
    defs.ThemeResponse = {
  "type" : "object",
  "properties" : {
    "ThemeInfo" : {
      "$ref" : "#/definitions/ThemeInfoResponse"
    }
  }
};
    defs.Unit = {
  "type" : "object",
  "properties" : {
    "unit-name" : {
      "type" : "string"
    }
  }
};
    defs.UpdateUserInfo = {
  "type" : "object",
  "properties" : {
    "active" : {
      "type" : "boolean",
      "default" : false
    },
    "password" : {
      "type" : "string"
    },
    "admin" : {
      "type" : "boolean",
      "default" : false
    },
    "local_user_name" : {
      "type" : "string"
    },
    "old_password" : {
      "type" : "string"
    },
    "display_name" : {
      "type" : "string"
    }
  }
};
    defs.UserAuthenticationSourceRequestCreateSwagger = {
  "type" : "object",
  "properties" : {
    "AuthenticationSourceInfo" : {
      "$ref" : "#/definitions/CreateUserAuthenticationSourceInfo"
    }
  }
};
    defs.UserAuthenticationSourceRequestUpdateInfo = {
  "type" : "object",
  "required" : [ "key" ],
  "properties" : {
    "old_key" : {
      "type" : "string"
    },
    "key" : {
      "type" : "string"
    }
  }
};
    defs.UserAuthenticationSourceRequestUpdateSwagger = {
  "type" : "object",
  "properties" : {
    "AuthenticationSourceInfo" : {
      "$ref" : "#/definitions/UserAuthenticationSourceRequestUpdateInfo"
    }
  }
};
    defs.UserAuthenticationSourceResponse = {
  "type" : "object",
  "required" : [ "authentication_type", "source_id", "user_name" ],
  "properties" : {
    "user_name" : {
      "type" : "string"
    },
    "source_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "authentication_type" : {
      "type" : "string",
      "enum" : [ "LOCAL", "LDAP", "JWT", "PAM", "KERBEROS" ]
    },
    "key" : {
      "type" : "string"
    },
    "created" : {
      "type" : "string",
      "format" : "date-time"
    },
    "updated" : {
      "type" : "string",
      "format" : "date-time"
    }
  }
};
    defs.UserAuthenticationSourceResponseSwagger = {
  "type" : "object",
  "properties" : {
    "AuthenticationSourceInfo" : {
      "$ref" : "#/definitions/UserAuthenticationSourceResponse"
    }
  }
};
    defs.UserAuthorizationResponse = {
  "type" : "object",
  "required" : [ "AuthorizationInfo/user_name" ],
  "properties" : {
    "AuthorizationInfo/authorization_id" : {
      "type" : "string"
    },
    "AuthorizationInfo/authorization_name" : {
      "type" : "string"
    },
    "AuthorizationInfo/resource_type" : {
      "type" : "string"
    },
    "AuthorizationInfo/user_name" : {
      "type" : "string"
    },
    "AuthorizationInfo/cluster_name" : {
      "type" : "string"
    },
    "AuthorizationInfo/view_name" : {
      "type" : "string"
    },
    "AuthorizationInfo/view_version" : {
      "type" : "string"
    },
    "AuthorizationInfo/view_instance_name" : {
      "type" : "string"
    }
  }
};
    defs.UserGroupInfo = {
  "type" : "object",
  "properties" : {
    "type" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    }
  }
};
    defs.UserPrivilegeResponse = {
  "type" : "object",
  "required" : [ "PrivilegeInfo/user_name" ],
  "properties" : {
    "permission_label" : {
      "type" : "string"
    },
    "privilege_id" : {
      "type" : "integer",
      "format" : "int32"
    },
    "permission_name" : {
      "type" : "string"
    },
    "principal_type" : {
      "type" : "string",
      "enum" : [ "USER", "GROUP", "ROLE" ]
    },
    "principal_name" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string",
      "enum" : [ "AMBARI", "CLUSTER", "VIEW" ]
    },
    "cluster_name" : {
      "type" : "string"
    },
    "view_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "instance_name" : {
      "type" : "string"
    },
    "PrivilegeInfo/user_name" : {
      "type" : "string"
    }
  }
};
    defs.UserRequestCreateUserSwagger = {
  "type" : "object",
  "properties" : {
    "Users" : {
      "$ref" : "#/definitions/CreateUserInfo"
    }
  }
};
    defs.UserRequestCreateUsersSwagger = {
  "type" : "object",
  "properties" : {
    "Users" : {
      "$ref" : "#/definitions/CreateUsersInfo"
    }
  }
};
    defs.UserRequestUpdateUserSwagger = {
  "type" : "object",
  "properties" : {
    "Users" : {
      "$ref" : "#/definitions/UpdateUserInfo"
    }
  }
};
    defs.UserResponse = {
  "type" : "object",
  "properties" : {
    "display_name" : {
      "type" : "string"
    },
    "user_type" : {
      "type" : "string",
      "enum" : [ "LOCAL", "LDAP", "JWT", "PAM", "KERBEROS" ]
    },
    "groups" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "string"
      }
    },
    "created" : {
      "type" : "string",
      "format" : "date-time"
    },
    "consecutive_failures" : {
      "type" : "integer",
      "format" : "int32"
    },
    "active" : {
      "type" : "boolean",
      "default" : false
    },
    "user_name" : {
      "type" : "string"
    },
    "ldap_user" : {
      "type" : "boolean",
      "default" : false
    },
    "admin" : {
      "type" : "boolean",
      "default" : false
    },
    "local_user_name" : {
      "type" : "string"
    }
  }
};
    defs.UserResponseSwagger = {
  "type" : "object",
  "properties" : {
    "Users" : {
      "$ref" : "#/definitions/UserResponse"
    }
  }
};
    defs.ValidationResult = {
  "type" : "object",
  "properties" : {
    "valid" : {
      "type" : "boolean",
      "default" : false
    },
    "detail" : {
      "type" : "string"
    }
  }
};
    defs.ValueAttributesInfo = {
  "type" : "object",
  "properties" : {
    "type" : {
      "type" : "string"
    },
    "maximum" : {
      "type" : "string"
    },
    "minimum" : {
      "type" : "string"
    },
    "unit" : {
      "type" : "string"
    },
    "delete" : {
      "type" : "string"
    },
    "visible" : {
      "type" : "boolean",
      "default" : false
    },
    "overridable" : {
      "type" : "boolean",
      "default" : false
    },
    "copy" : {
      "type" : "string"
    },
    "empty_value_valid" : {
      "type" : "boolean",
      "xml" : {
        "name" : "empty-value-valid"
      },
      "default" : false
    },
    "ui_only_property" : {
      "type" : "boolean",
      "xml" : {
        "name" : "ui-only-property"
      },
      "default" : false
    },
    "read_only" : {
      "type" : "boolean",
      "xml" : {
        "name" : "read-only"
      },
      "default" : false
    },
    "editable_only_at_install" : {
      "type" : "boolean",
      "xml" : {
        "name" : "editable-only-at-install"
      },
      "default" : false
    },
    "show_property_name" : {
      "type" : "boolean",
      "xml" : {
        "name" : "show-property-name"
      },
      "default" : false
    },
    "increment_step" : {
      "type" : "string",
      "xml" : {
        "name" : "increment-step"
      }
    },
    "entries" : {
      "type" : "array",
      "xml" : {
        "name" : "entries",
        "wrapped" : true
      },
      "items" : {
        "$ref" : "#/definitions/ValueEntryInfo"
      }
    },
    "hidden" : {
      "type" : "string"
    },
    "entries_editable" : {
      "type" : "boolean",
      "default" : false
    },
    "selection_cardinality" : {
      "type" : "string",
      "xml" : {
        "name" : "selection-cardinality"
      }
    },
    "property-file-name" : {
      "type" : "string"
    },
    "property-file-type" : {
      "type" : "string"
    },
    "user-group-entries" : {
      "type" : "array",
      "xml" : {
        "name" : "user-groups",
        "wrapped" : true
      },
      "items" : {
        "$ref" : "#/definitions/UserGroupInfo"
      }
    },
    "keystore" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.ValueEntryInfo = {
  "type" : "object",
  "properties" : {
    "value" : {
      "type" : "string"
    },
    "label" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    }
  }
};
    defs.VersionDefinitionXml = {
  "type" : "object",
  "properties" : {
    "release" : {
      "$ref" : "#/definitions/Release"
    },
    "repositoryInfo" : {
      "xml" : {
        "name" : "repository-info"
      },
      "$ref" : "#/definitions/RepositoryXml"
    },
    "xsdLocation" : {
      "type" : "string"
    },
    "stackDefault" : {
      "type" : "boolean",
      "default" : false
    }
  },
  "xml" : {
    "name" : "repository-version"
  }
};
    defs.ViewInfo = {
  "type" : "object",
  "properties" : {
    "view_name" : {
      "type" : "string"
    }
  }
};
    defs.ViewInstanceResponse = {
  "type" : "object",
  "properties" : {
    "ViewInstanceInfo" : {
      "$ref" : "#/definitions/ViewInstanceResponseInfo"
    }
  }
};
    defs.ViewInstanceResponseInfo = {
  "type" : "object",
  "properties" : {
    "view_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "instance_name" : {
      "type" : "string"
    },
    "label" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    },
    "visible" : {
      "type" : "boolean",
      "default" : false
    },
    "icon_path" : {
      "type" : "string"
    },
    "icon64_path" : {
      "type" : "string"
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "instance_data" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "cluster_handle" : {
      "type" : "integer",
      "format" : "int32"
    },
    "cluster_type" : {
      "type" : "string",
      "enum" : [ "LOCAL_AMBARI", "REMOTE_AMBARI", "NONE" ]
    },
    "context_path" : {
      "type" : "string"
    },
    "static" : {
      "type" : "boolean",
      "default" : false
    },
    "short_url" : {
      "type" : "string"
    },
    "short_url_name" : {
      "type" : "string"
    },
    "validation_result" : {
      "$ref" : "#/definitions/ValidationResult"
    },
    "property_validation_results" : {
      "type" : "object",
      "additionalProperties" : {
        "$ref" : "#/definitions/ValidationResult"
      }
    }
  }
};
    defs.ViewPermissionInfo = {
  "type" : "object",
  "properties" : {
    "view_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "permission_id" : {
      "type" : "integer",
      "format" : "int32"
    },
    "permission_name" : {
      "type" : "string"
    },
    "resource_name" : {
      "type" : "string"
    }
  }
};
    defs.ViewPermissionResponse = {
  "type" : "object",
  "properties" : {
    "PermissionInfo" : {
      "$ref" : "#/definitions/ViewPermissionInfo"
    }
  }
};
    defs.ViewPrivilegeResponse = {
  "type" : "object",
  "properties" : {
    "permission_label" : {
      "type" : "string"
    },
    "privilege_id" : {
      "type" : "integer",
      "format" : "int32"
    },
    "permission_name" : {
      "type" : "string"
    },
    "principal_type" : {
      "type" : "string",
      "enum" : [ "USER", "GROUP", "ROLE" ]
    },
    "principal_name" : {
      "type" : "string"
    },
    "view_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "instance_name" : {
      "type" : "string"
    }
  }
};
    defs.ViewPrivilegeResponseWrapper = {
  "type" : "object",
  "properties" : {
    "PrivilegeInfo" : {
      "$ref" : "#/definitions/ViewPrivilegeResponse"
    }
  }
};
    defs.ViewPrivilegeService = {
  "type" : "object"
};
    defs.ViewResponse = {
  "type" : "object",
  "properties" : {
    "ViewInfo" : {
      "$ref" : "#/definitions/ViewInfo"
    }
  }
};
    defs.ViewUrlInfo = {
  "type" : "object",
  "properties" : {
    "view_instance_name" : {
      "type" : "string"
    },
    "view_instance_common_name" : {
      "type" : "string"
    },
    "view_instance_version" : {
      "type" : "string"
    },
    "url_suffix" : {
      "type" : "string"
    },
    "url_name" : {
      "type" : "string"
    }
  }
};
    defs.ViewUrlResponseSwagger = {
  "type" : "object",
  "properties" : {
    "ViewUrlInfo" : {
      "$ref" : "#/definitions/ViewUrlInfo"
    }
  }
};
    defs.ViewVersionInfo = {
  "type" : "object",
  "properties" : {
    "archive" : {
      "type" : "string"
    },
    "build_number" : {
      "type" : "string"
    },
    "cluster_configurable" : {
      "type" : "boolean",
      "default" : false
    },
    "description" : {
      "type" : "string"
    },
    "label" : {
      "type" : "string"
    },
    "masker_class" : {
      "type" : "string"
    },
    "max_ambari_version" : {
      "type" : "string"
    },
    "min_ambari_version" : {
      "type" : "string"
    },
    "parameters" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ParameterConfig"
      }
    },
    "status" : {
      "type" : "string",
      "enum" : [ "PENDING", "DEPLOYING", "DEPLOYED", "ERROR" ]
    },
    "status_detail" : {
      "type" : "string"
    },
    "system" : {
      "type" : "boolean",
      "default" : false
    },
    "version" : {
      "type" : "string"
    },
    "view_name" : {
      "type" : "string"
    }
  }
};
    defs.ViewVersionResponse = {
  "type" : "object",
  "properties" : {
    "ViewVersionInfo" : {
      "$ref" : "#/definitions/ViewVersionInfo"
    }
  }
};
    defs.Widget = {
  "type" : "object",
  "properties" : {
    "type" : {
      "type" : "string"
    },
    "units" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Unit"
      }
    },
    "required-properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "display-name" : {
      "type" : "string"
    }
  }
};
    defs.WidgetEntry = {
  "type" : "object",
  "properties" : {
    "config" : {
      "type" : "string"
    },
    "widget" : {
      "$ref" : "#/definitions/Widget"
    }
  }
};
    defs.WidgetLayoutIdWrapper = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    }
  }
};
    defs.WidgetResponse = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "widgetName" : {
      "type" : "string"
    },
    "widgetType" : {
      "type" : "string"
    },
    "metrics" : {
      "type" : "string"
    },
    "timeCreated" : {
      "type" : "integer",
      "format" : "int64"
    },
    "author" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    },
    "displayName" : {
      "type" : "string"
    },
    "scope" : {
      "type" : "string"
    },
    "widgetValues" : {
      "type" : "string"
    },
    "properties" : {
      "type" : "string"
    },
    "clusterName" : {
      "type" : "string"
    },
    "tag" : {
      "type" : "string"
    }
  }
};
  </script>

  <div class="container-fluid">
    <div class="row-fluid">
      <div id="sidenav" class="span2">
        <nav id="scrollingNav">
          <ul class="sidenav nav nav-list">
            <!-- Logo Area -->
              <!--<div style="width: 80%; background-color: #4c8eca; color: white; padding: 20px; text-align: center; margin-bottom: 20px; ">

              API Docs 2

              </div>
            -->
            <li class="nav-fixed nav-header active" data-group="_"><a href="#api-_">API Summary</a></li>

                  <li class="nav-header" data-group="Actions"><a href="#api-Actions">API Methods - Actions</a></li>
                    <li data-group="Actions" data-name="actionServiceCreateActionDefinition" class="">
                      <a href="#api-Actions-actionServiceCreateActionDefinition">actionServiceCreateActionDefinition</a>
                    </li>
                    <li data-group="Actions" data-name="actionServiceDeleteActionDefinition" class="">
                      <a href="#api-Actions-actionServiceDeleteActionDefinition">actionServiceDeleteActionDefinition</a>
                    </li>
                    <li data-group="Actions" data-name="actionServiceGetActionDefinition" class="">
                      <a href="#api-Actions-actionServiceGetActionDefinition">actionServiceGetActionDefinition</a>
                    </li>
                    <li data-group="Actions" data-name="actionServiceGetActionDefinitions" class="">
                      <a href="#api-Actions-actionServiceGetActionDefinitions">actionServiceGetActionDefinitions</a>
                    </li>
                    <li data-group="Actions" data-name="actionServiceUpdateActionDefinition" class="">
                      <a href="#api-Actions-actionServiceUpdateActionDefinition">actionServiceUpdateActionDefinition</a>
                    </li>
                  <li class="nav-header" data-group="Alerts"><a href="#api-Alerts">API Methods - Alerts</a></li>
                    <li data-group="Alerts" data-name="createTarget" class="">
                      <a href="#api-Alerts-createTarget">createTarget</a>
                    </li>
                    <li data-group="Alerts" data-name="deleteTarget" class="">
                      <a href="#api-Alerts-deleteTarget">deleteTarget</a>
                    </li>
                    <li data-group="Alerts" data-name="getTarget" class="">
                      <a href="#api-Alerts-getTarget">getTarget</a>
                    </li>
                    <li data-group="Alerts" data-name="getTargets" class="">
                      <a href="#api-Alerts-getTargets">getTargets</a>
                    </li>
                    <li data-group="Alerts" data-name="updateTarget" class="">
                      <a href="#api-Alerts-updateTarget">updateTarget</a>
                    </li>
                  <li class="nav-header" data-group="Blueprints"><a href="#api-Blueprints">API Methods - Blueprints</a></li>
                    <li data-group="Blueprints" data-name="blueprintServiceCreateBlueprint" class="">
                      <a href="#api-Blueprints-blueprintServiceCreateBlueprint">blueprintServiceCreateBlueprint</a>
                    </li>
                    <li data-group="Blueprints" data-name="blueprintServiceDeleteBlueprint" class="">
                      <a href="#api-Blueprints-blueprintServiceDeleteBlueprint">blueprintServiceDeleteBlueprint</a>
                    </li>
                    <li data-group="Blueprints" data-name="blueprintServiceDeleteBlueprints" class="">
                      <a href="#api-Blueprints-blueprintServiceDeleteBlueprints">blueprintServiceDeleteBlueprints</a>
                    </li>
                    <li data-group="Blueprints" data-name="blueprintServiceGetBlueprint" class="">
                      <a href="#api-Blueprints-blueprintServiceGetBlueprint">blueprintServiceGetBlueprint</a>
                    </li>
                    <li data-group="Blueprints" data-name="blueprintServiceGetBlueprints" class="">
                      <a href="#api-Blueprints-blueprintServiceGetBlueprints">blueprintServiceGetBlueprints</a>
                    </li>
                  <li class="nav-header" data-group="ClusterServices"><a href="#api-ClusterServices">API Methods - ClusterServices</a></li>
                    <li data-group="ClusterServices" data-name="serviceServiceCreateArtifact" class="">
                      <a href="#api-ClusterServices-serviceServiceCreateArtifact">serviceServiceCreateArtifact</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceCreateServices" class="">
                      <a href="#api-ClusterServices-serviceServiceCreateServices">serviceServiceCreateServices</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceDeleteArtifact" class="">
                      <a href="#api-ClusterServices-serviceServiceDeleteArtifact">serviceServiceDeleteArtifact</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceDeleteArtifacts" class="">
                      <a href="#api-ClusterServices-serviceServiceDeleteArtifacts">serviceServiceDeleteArtifacts</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceDeleteService" class="">
                      <a href="#api-ClusterServices-serviceServiceDeleteService">serviceServiceDeleteService</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceGetArtifact" class="">
                      <a href="#api-ClusterServices-serviceServiceGetArtifact">serviceServiceGetArtifact</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceGetArtifacts" class="">
                      <a href="#api-ClusterServices-serviceServiceGetArtifacts">serviceServiceGetArtifacts</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceGetService" class="">
                      <a href="#api-ClusterServices-serviceServiceGetService">serviceServiceGetService</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceGetServices" class="">
                      <a href="#api-ClusterServices-serviceServiceGetServices">serviceServiceGetServices</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceUpdateArtifact" class="">
                      <a href="#api-ClusterServices-serviceServiceUpdateArtifact">serviceServiceUpdateArtifact</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceUpdateArtifacts" class="">
                      <a href="#api-ClusterServices-serviceServiceUpdateArtifacts">serviceServiceUpdateArtifacts</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceUpdateService" class="">
                      <a href="#api-ClusterServices-serviceServiceUpdateService">serviceServiceUpdateService</a>
                    </li>
                  <li class="nav-header" data-group="Clusters"><a href="#api-Clusters">API Methods - Clusters</a></li>
                    <li data-group="Clusters" data-name="createCluster" class="">
                      <a href="#api-Clusters-createCluster">createCluster</a>
                    </li>
                    <li data-group="Clusters" data-name="createClusterArtifact" class="">
                      <a href="#api-Clusters-createClusterArtifact">createClusterArtifact</a>
                    </li>
                    <li data-group="Clusters" data-name="deleteCluster" class="">
                      <a href="#api-Clusters-deleteCluster">deleteCluster</a>
                    </li>
                    <li data-group="Clusters" data-name="deleteClusterArtifact" class="">
                      <a href="#api-Clusters-deleteClusterArtifact">deleteClusterArtifact</a>
                    </li>
                    <li data-group="Clusters" data-name="deleteClusterArtifacts" class="">
                      <a href="#api-Clusters-deleteClusterArtifacts">deleteClusterArtifacts</a>
                    </li>
                    <li data-group="Clusters" data-name="getCluster" class="">
                      <a href="#api-Clusters-getCluster">getCluster</a>
                    </li>
                    <li data-group="Clusters" data-name="getClusterArtifact" class="">
                      <a href="#api-Clusters-getClusterArtifact">getClusterArtifact</a>
                    </li>
                    <li data-group="Clusters" data-name="getClusterArtifacts" class="">
                      <a href="#api-Clusters-getClusterArtifacts">getClusterArtifacts</a>
                    </li>
                    <li data-group="Clusters" data-name="getClusters" class="">
                      <a href="#api-Clusters-getClusters">getClusters</a>
                    </li>
                    <li data-group="Clusters" data-name="updateCluster" class="">
                      <a href="#api-Clusters-updateCluster">updateCluster</a>
                    </li>
                    <li data-group="Clusters" data-name="updateClusterArtifact" class="">
                      <a href="#api-Clusters-updateClusterArtifact">updateClusterArtifact</a>
                    </li>
                    <li data-group="Clusters" data-name="updateClusterArtifacts" class="">
                      <a href="#api-Clusters-updateClusterArtifacts">updateClusterArtifacts</a>
                    </li>
                  <li class="nav-header" data-group="ConfigGroups"><a href="#api-ConfigGroups">API Methods - ConfigGroups</a></li>
                    <li data-group="ConfigGroups" data-name="createConfigGroup" class="">
                      <a href="#api-ConfigGroups-createConfigGroup">createConfigGroup</a>
                    </li>
                    <li data-group="ConfigGroups" data-name="deleteConfigGroup" class="">
                      <a href="#api-ConfigGroups-deleteConfigGroup">deleteConfigGroup</a>
                    </li>
                    <li data-group="ConfigGroups" data-name="getConfigGroup" class="">
                      <a href="#api-ConfigGroups-getConfigGroup">getConfigGroup</a>
                    </li>
                    <li data-group="ConfigGroups" data-name="getConfigGroups" class="">
                      <a href="#api-ConfigGroups-getConfigGroups">getConfigGroups</a>
                    </li>
                    <li data-group="ConfigGroups" data-name="updateConfigGroup" class="">
                      <a href="#api-ConfigGroups-updateConfigGroup">updateConfigGroup</a>
                    </li>
                  <li class="nav-header" data-group="Configurations"><a href="#api-Configurations">API Methods - Configurations</a></li>
                    <li data-group="Configurations" data-name="createConfigurations" class="">
                      <a href="#api-Configurations-createConfigurations">createConfigurations</a>
                    </li>
                    <li data-group="Configurations" data-name="getConfigurations" class="">
                      <a href="#api-Configurations-getConfigurations">getConfigurations</a>
                    </li>
                    <li data-group="Configurations" data-name="getServiceConfigVersions" class="">
                      <a href="#api-Configurations-getServiceConfigVersions">getServiceConfigVersions</a>
                    </li>
                  <li class="nav-header" data-group="Groups"><a href="#api-Groups">API Methods - Groups</a></li>
                    <li data-group="Groups" data-name="groupPrivilegeServiceGetPrivilege" class="">
                      <a href="#api-Groups-groupPrivilegeServiceGetPrivilege">groupPrivilegeServiceGetPrivilege</a>
                    </li>
                    <li data-group="Groups" data-name="groupPrivilegeServiceGetPrivileges" class="">
                      <a href="#api-Groups-groupPrivilegeServiceGetPrivileges">groupPrivilegeServiceGetPrivileges</a>
                    </li>
                    <li data-group="Groups" data-name="groupServiceCreateGroup" class="">
                      <a href="#api-Groups-groupServiceCreateGroup">groupServiceCreateGroup</a>
                    </li>
                    <li data-group="Groups" data-name="groupServiceDeleteGroup" class="">
                      <a href="#api-Groups-groupServiceDeleteGroup">groupServiceDeleteGroup</a>
                    </li>
                    <li data-group="Groups" data-name="groupServiceGetGroup" class="">
                      <a href="#api-Groups-groupServiceGetGroup">groupServiceGetGroup</a>
                    </li>
                    <li data-group="Groups" data-name="groupServiceGetGroups" class="">
                      <a href="#api-Groups-groupServiceGetGroups">groupServiceGetGroups</a>
                    </li>
                    <li data-group="Groups" data-name="memberServiceDeleteMember" class="">
                      <a href="#api-Groups-memberServiceDeleteMember">memberServiceDeleteMember</a>
                    </li>
                    <li data-group="Groups" data-name="memberServiceGetMember" class="">
                      <a href="#api-Groups-memberServiceGetMember">memberServiceGetMember</a>
                    </li>
                    <li data-group="Groups" data-name="memberServiceGetMembers" class="">
                      <a href="#api-Groups-memberServiceGetMembers">memberServiceGetMembers</a>
                    </li>
                    <li data-group="Groups" data-name="memberServiceUpdateMembers" class="">
                      <a href="#api-Groups-memberServiceUpdateMembers">memberServiceUpdateMembers</a>
                    </li>
                  <li class="nav-header" data-group="HostComponents"><a href="#api-HostComponents">API Methods - HostComponents</a></li>
                    <li data-group="HostComponents" data-name="createHostComponent" class="">
                      <a href="#api-HostComponents-createHostComponent">createHostComponent</a>
                    </li>
                    <li data-group="HostComponents" data-name="deleteHostComponent" class="">
                      <a href="#api-HostComponents-deleteHostComponent">deleteHostComponent</a>
                    </li>
                    <li data-group="HostComponents" data-name="deleteHostComponents" class="">
                      <a href="#api-HostComponents-deleteHostComponents">deleteHostComponents</a>
                    </li>
                    <li data-group="HostComponents" data-name="getHostComponent" class="">
                      <a href="#api-HostComponents-getHostComponent">getHostComponent</a>
                    </li>
                    <li data-group="HostComponents" data-name="getHostComponents" class="">
                      <a href="#api-HostComponents-getHostComponents">getHostComponents</a>
                    </li>
                    <li data-group="HostComponents" data-name="getProcesses" class="">
                      <a href="#api-HostComponents-getProcesses">getProcesses</a>
                    </li>
                    <li data-group="HostComponents" data-name="updateHostComponent" class="">
                      <a href="#api-HostComponents-updateHostComponent">updateHostComponent</a>
                    </li>
                  <li class="nav-header" data-group="Hosts"><a href="#api-Hosts">API Methods - Hosts</a></li>
                    <li data-group="Hosts" data-name="createHost" class="">
                      <a href="#api-Hosts-createHost">createHost</a>
                    </li>
                    <li data-group="Hosts" data-name="createHosts" class="">
                      <a href="#api-Hosts-createHosts">createHosts</a>
                    </li>
                    <li data-group="Hosts" data-name="deleteHost" class="">
                      <a href="#api-Hosts-deleteHost">deleteHost</a>
                    </li>
                    <li data-group="Hosts" data-name="deleteHosts" class="">
                      <a href="#api-Hosts-deleteHosts">deleteHosts</a>
                    </li>
                    <li data-group="Hosts" data-name="getHost" class="">
                      <a href="#api-Hosts-getHost">getHost</a>
                    </li>
                    <li data-group="Hosts" data-name="getHosts" class="">
                      <a href="#api-Hosts-getHosts">getHosts</a>
                    </li>
                    <li data-group="Hosts" data-name="updateHost" class="">
                      <a href="#api-Hosts-updateHost">updateHost</a>
                    </li>
                    <li data-group="Hosts" data-name="updateHosts" class="">
                      <a href="#api-Hosts-updateHosts">updateHosts</a>
                    </li>
                  <li class="nav-header" data-group="RequestSchedules"><a href="#api-RequestSchedules">API Methods - RequestSchedules</a></li>
                    <li data-group="RequestSchedules" data-name="createRequestSchedule" class="">
                      <a href="#api-RequestSchedules-createRequestSchedule">createRequestSchedule</a>
                    </li>
                    <li data-group="RequestSchedules" data-name="deleteRequestSchedule" class="">
                      <a href="#api-RequestSchedules-deleteRequestSchedule">deleteRequestSchedule</a>
                    </li>
                    <li data-group="RequestSchedules" data-name="getRequestSchedule" class="">
                      <a href="#api-RequestSchedules-getRequestSchedule">getRequestSchedule</a>
                    </li>
                    <li data-group="RequestSchedules" data-name="getRequestSchedules" class="">
                      <a href="#api-RequestSchedules-getRequestSchedules">getRequestSchedules</a>
                    </li>
                  <li class="nav-header" data-group="Requests"><a href="#api-Requests">API Methods - Requests</a></li>
                    <li data-group="Requests" data-name="requestServiceCreateRequests" class="">
                      <a href="#api-Requests-requestServiceCreateRequests">requestServiceCreateRequests</a>
                    </li>
                    <li data-group="Requests" data-name="requestServiceGetRequest" class="">
                      <a href="#api-Requests-requestServiceGetRequest">requestServiceGetRequest</a>
                    </li>
                    <li data-group="Requests" data-name="requestServiceGetRequests" class="">
                      <a href="#api-Requests-requestServiceGetRequests">requestServiceGetRequests</a>
                    </li>
                    <li data-group="Requests" data-name="requestServiceUpdateRequests" class="">
                      <a href="#api-Requests-requestServiceUpdateRequests">requestServiceUpdateRequests</a>
                    </li>
                  <li class="nav-header" data-group="RootServiceConfigurations"><a href="#api-RootServiceConfigurations">API Methods - RootServiceConfigurations</a></li>
                    <li data-group="RootServiceConfigurations" data-name="rootServiceComponentConfigurationServiceDeleteConfiguration" class="">
                      <a href="#api-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration">rootServiceComponentConfigurationServiceDeleteConfiguration</a>
                    </li>
                    <li data-group="RootServiceConfigurations" data-name="rootServiceComponentConfigurationServiceGetConfiguration" class="">
                      <a href="#api-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration">rootServiceComponentConfigurationServiceGetConfiguration</a>
                    </li>
                    <li data-group="RootServiceConfigurations" data-name="rootServiceComponentConfigurationServiceUpdateConfiguration" class="">
                      <a href="#api-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration">rootServiceComponentConfigurationServiceUpdateConfiguration</a>
                    </li>
                  <li class="nav-header" data-group="Services"><a href="#api-Services">API Methods - Services</a></li>
                    <li data-group="Services" data-name="getRootHost" class="">
                      <a href="#api-Services-getRootHost">getRootHost</a>
                    </li>
                    <li data-group="Services" data-name="getRootHosts" class="">
                      <a href="#api-Services-getRootHosts">getRootHosts</a>
                    </li>
                    <li data-group="Services" data-name="getRootService" class="">
                      <a href="#api-Services-getRootService">getRootService</a>
                    </li>
                    <li data-group="Services" data-name="getRootServiceComponent" class="">
                      <a href="#api-Services-getRootServiceComponent">getRootServiceComponent</a>
                    </li>
                    <li data-group="Services" data-name="getRootServiceComponentHosts" class="">
                      <a href="#api-Services-getRootServiceComponentHosts">getRootServiceComponentHosts</a>
                    </li>
                    <li data-group="Services" data-name="getRootServiceComponents" class="">
                      <a href="#api-Services-getRootServiceComponents">getRootServiceComponents</a>
                    </li>
                    <li data-group="Services" data-name="getRootServiceHostComponent" class="">
                      <a href="#api-Services-getRootServiceHostComponent">getRootServiceHostComponent</a>
                    </li>
                    <li data-group="Services" data-name="getRootServiceHostComponents" class="">
                      <a href="#api-Services-getRootServiceHostComponents">getRootServiceHostComponents</a>
                    </li>
                    <li data-group="Services" data-name="getRootServices" class="">
                      <a href="#api-Services-getRootServices">getRootServices</a>
                    </li>
                  <li class="nav-header" data-group="Settings"><a href="#api-Settings">API Methods - Settings</a></li>
                    <li data-group="Settings" data-name="createSetting" class="">
                      <a href="#api-Settings-createSetting">createSetting</a>
                    </li>
                    <li data-group="Settings" data-name="deleteSetting" class="">
                      <a href="#api-Settings-deleteSetting">deleteSetting</a>
                    </li>
                    <li data-group="Settings" data-name="getSetting" class="">
                      <a href="#api-Settings-getSetting">getSetting</a>
                    </li>
                    <li data-group="Settings" data-name="getSettings" class="">
                      <a href="#api-Settings-getSettings">getSettings</a>
                    </li>
                    <li data-group="Settings" data-name="updateSetting" class="">
                      <a href="#api-Settings-updateSetting">updateSetting</a>
                    </li>
                  <li class="nav-header" data-group="Stacks"><a href="#api-Stacks">API Methods - Stacks</a></li>
                    <li data-group="Stacks" data-name="stacksServiceGetServiceComponent" class="">
                      <a href="#api-Stacks-stacksServiceGetServiceComponent">stacksServiceGetServiceComponent</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetServiceComponentDependencies" class="">
                      <a href="#api-Stacks-stacksServiceGetServiceComponentDependencies">stacksServiceGetServiceComponentDependencies</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetServiceComponentDependency" class="">
                      <a href="#api-Stacks-stacksServiceGetServiceComponentDependency">stacksServiceGetServiceComponentDependency</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetServiceComponents" class="">
                      <a href="#api-Stacks-stacksServiceGetServiceComponents">stacksServiceGetServiceComponents</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStack" class="">
                      <a href="#api-Stacks-stacksServiceGetStack">stacksServiceGetStack</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackArtifact" class="">
                      <a href="#api-Stacks-stacksServiceGetStackArtifact">stacksServiceGetStackArtifact</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackArtifacts" class="">
                      <a href="#api-Stacks-stacksServiceGetStackArtifacts">stacksServiceGetStackArtifacts</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackConfiguration" class="">
                      <a href="#api-Stacks-stacksServiceGetStackConfiguration">stacksServiceGetStackConfiguration</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackConfigurationDependencies" class="">
                      <a href="#api-Stacks-stacksServiceGetStackConfigurationDependencies">stacksServiceGetStackConfigurationDependencies</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackConfigurations" class="">
                      <a href="#api-Stacks-stacksServiceGetStackConfigurations">stacksServiceGetStackConfigurations</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackLevelConfiguration" class="">
                      <a href="#api-Stacks-stacksServiceGetStackLevelConfiguration">stacksServiceGetStackLevelConfiguration</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackLevelConfigurations" class="">
                      <a href="#api-Stacks-stacksServiceGetStackLevelConfigurations">stacksServiceGetStackLevelConfigurations</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackService" class="">
                      <a href="#api-Stacks-stacksServiceGetStackService">stacksServiceGetStackService</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackServiceArtifact" class="">
                      <a href="#api-Stacks-stacksServiceGetStackServiceArtifact">stacksServiceGetStackServiceArtifact</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackServiceArtifacts" class="">
                      <a href="#api-Stacks-stacksServiceGetStackServiceArtifacts">stacksServiceGetStackServiceArtifacts</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackServiceQuickLinksConfiguration" class="">
                      <a href="#api-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration">stacksServiceGetStackServiceQuickLinksConfiguration</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackServiceQuickLinksConfigurations" class="">
                      <a href="#api-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations">stacksServiceGetStackServiceQuickLinksConfigurations</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackServiceTheme" class="">
                      <a href="#api-Stacks-stacksServiceGetStackServiceTheme">stacksServiceGetStackServiceTheme</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackServiceThemes" class="">
                      <a href="#api-Stacks-stacksServiceGetStackServiceThemes">stacksServiceGetStackServiceThemes</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackServices" class="">
                      <a href="#api-Stacks-stacksServiceGetStackServices">stacksServiceGetStackServices</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackVersion" class="">
                      <a href="#api-Stacks-stacksServiceGetStackVersion">stacksServiceGetStackVersion</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackVersionLinks" class="">
                      <a href="#api-Stacks-stacksServiceGetStackVersionLinks">stacksServiceGetStackVersionLinks</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackVersions" class="">
                      <a href="#api-Stacks-stacksServiceGetStackVersions">stacksServiceGetStackVersions</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStacks" class="">
                      <a href="#api-Stacks-stacksServiceGetStacks">stacksServiceGetStacks</a>
                    </li>
                  <li class="nav-header" data-group="UserAuthenticationSources"><a href="#api-UserAuthenticationSources">API Methods - UserAuthenticationSources</a></li>
                    <li data-group="UserAuthenticationSources" data-name="createAuthenticationSources" class="">
                      <a href="#api-UserAuthenticationSources-createAuthenticationSources">createAuthenticationSources</a>
                    </li>
                    <li data-group="UserAuthenticationSources" data-name="deleteAuthenticationSource" class="">
                      <a href="#api-UserAuthenticationSources-deleteAuthenticationSource">deleteAuthenticationSource</a>
                    </li>
                    <li data-group="UserAuthenticationSources" data-name="getAuthenticationSource" class="">
                      <a href="#api-UserAuthenticationSources-getAuthenticationSource">getAuthenticationSource</a>
                    </li>
                    <li data-group="UserAuthenticationSources" data-name="getAuthenticationSources" class="">
                      <a href="#api-UserAuthenticationSources-getAuthenticationSources">getAuthenticationSources</a>
                    </li>
                    <li data-group="UserAuthenticationSources" data-name="updateAuthenticationSource" class="">
                      <a href="#api-UserAuthenticationSources-updateAuthenticationSource">updateAuthenticationSource</a>
                    </li>
                  <li class="nav-header" data-group="Users"><a href="#api-Users">API Methods - Users</a></li>
                    <li data-group="Users" data-name="activeWidgetLayoutServiceGetServices" class="">
                      <a href="#api-Users-activeWidgetLayoutServiceGetServices">activeWidgetLayoutServiceGetServices</a>
                    </li>
                    <li data-group="Users" data-name="activeWidgetLayoutServiceUpdateServices" class="">
                      <a href="#api-Users-activeWidgetLayoutServiceUpdateServices">activeWidgetLayoutServiceUpdateServices</a>
                    </li>
                    <li data-group="Users" data-name="createUser" class="">
                      <a href="#api-Users-createUser">createUser</a>
                    </li>
                    <li data-group="Users" data-name="createUsers" class="">
                      <a href="#api-Users-createUsers">createUsers</a>
                    </li>
                    <li data-group="Users" data-name="deleteUser" class="">
                      <a href="#api-Users-deleteUser">deleteUser</a>
                    </li>
                    <li data-group="Users" data-name="getUser" class="">
                      <a href="#api-Users-getUser">getUser</a>
                    </li>
                    <li data-group="Users" data-name="getUsers" class="">
                      <a href="#api-Users-getUsers">getUsers</a>
                    </li>
                    <li data-group="Users" data-name="updateUser" class="">
                      <a href="#api-Users-updateUser">updateUser</a>
                    </li>
                    <li data-group="Users" data-name="userAuthorizationServiceGetAuthorization" class="">
                      <a href="#api-Users-userAuthorizationServiceGetAuthorization">userAuthorizationServiceGetAuthorization</a>
                    </li>
                    <li data-group="Users" data-name="userAuthorizationServiceGetAuthorizations" class="">
                      <a href="#api-Users-userAuthorizationServiceGetAuthorizations">userAuthorizationServiceGetAuthorizations</a>
                    </li>
                    <li data-group="Users" data-name="userPrivilegeServiceGetPrivilege" class="">
                      <a href="#api-Users-userPrivilegeServiceGetPrivilege">userPrivilegeServiceGetPrivilege</a>
                    </li>
                    <li data-group="Users" data-name="userPrivilegeServiceGetPrivileges" class="">
                      <a href="#api-Users-userPrivilegeServiceGetPrivileges">userPrivilegeServiceGetPrivileges</a>
                    </li>
                  <li class="nav-header" data-group="Views"><a href="#api-Views">API Methods - Views</a></li>
                    <li data-group="Views" data-name="createPrivilege" class="">
                      <a href="#api-Views-createPrivilege">createPrivilege</a>
                    </li>
                    <li data-group="Views" data-name="createService" class="">
                      <a href="#api-Views-createService">createService</a>
                    </li>
                    <li data-group="Views" data-name="createServices" class="">
                      <a href="#api-Views-createServices">createServices</a>
                    </li>
                    <li data-group="Views" data-name="createUrl" class="">
                      <a href="#api-Views-createUrl">createUrl</a>
                    </li>
                    <li data-group="Views" data-name="deletePrivilege" class="">
                      <a href="#api-Views-deletePrivilege">deletePrivilege</a>
                    </li>
                    <li data-group="Views" data-name="deletePrivileges" class="">
                      <a href="#api-Views-deletePrivileges">deletePrivileges</a>
                    </li>
                    <li data-group="Views" data-name="deleteService" class="">
                      <a href="#api-Views-deleteService">deleteService</a>
                    </li>
                    <li data-group="Views" data-name="deleteUrl" class="">
                      <a href="#api-Views-deleteUrl">deleteUrl</a>
                    </li>
                    <li data-group="Views" data-name="getPermission" class="">
                      <a href="#api-Views-getPermission">getPermission</a>
                    </li>
                    <li data-group="Views" data-name="getPermissions" class="">
                      <a href="#api-Views-getPermissions">getPermissions</a>
                    </li>
                    <li data-group="Views" data-name="getPrivilege" class="">
                      <a href="#api-Views-getPrivilege">getPrivilege</a>
                    </li>
                    <li data-group="Views" data-name="getPrivileges" class="">
                      <a href="#api-Views-getPrivileges">getPrivileges</a>
                    </li>
                    <li data-group="Views" data-name="getService" class="">
                      <a href="#api-Views-getService">getService</a>
                    </li>
                    <li data-group="Views" data-name="getServices" class="">
                      <a href="#api-Views-getServices">getServices</a>
                    </li>
                    <li data-group="Views" data-name="getVersion" class="">
                      <a href="#api-Views-getVersion">getVersion</a>
                    </li>
                    <li data-group="Views" data-name="getVersions" class="">
                      <a href="#api-Views-getVersions">getVersions</a>
                    </li>
                    <li data-group="Views" data-name="getView" class="">
                      <a href="#api-Views-getView">getView</a>
                    </li>
                    <li data-group="Views" data-name="getViewUrl" class="">
                      <a href="#api-Views-getViewUrl">getViewUrl</a>
                    </li>
                    <li data-group="Views" data-name="getViewUrls" class="">
                      <a href="#api-Views-getViewUrls">getViewUrls</a>
                    </li>
                    <li data-group="Views" data-name="getViews" class="">
                      <a href="#api-Views-getViews">getViews</a>
                    </li>
                    <li data-group="Views" data-name="migrateData" class="">
                      <a href="#api-Views-migrateData">migrateData</a>
                    </li>
                    <li data-group="Views" data-name="updatePrivileges" class="">
                      <a href="#api-Views-updatePrivileges">updatePrivileges</a>
                    </li>
                    <li data-group="Views" data-name="updateService" class="">
                      <a href="#api-Views-updateService">updateService</a>
                    </li>
                    <li data-group="Views" data-name="updateServices" class="">
                      <a href="#api-Views-updateServices">updateServices</a>
                    </li>
                    <li data-group="Views" data-name="updateUrl" class="">
                      <a href="#api-Views-updateUrl">updateUrl</a>
                    </li>
          </ul>
        </nav>
      </div>
      <div id="content">
        <div id="project">
          <div class="pull-left">
            <h1>Swagger spec for Ambari REST API</h1>
          </div>
          <div class="clearfix"></div>
        </div>
        <div id="header">
          <div id="api-_">
            <h2 id="welcome-to-apidoc">API and SDK Documentation</h2>
              <div class="app-desc">Version: v1</div>
            <hr>
            <p class="marked">Ambari REST APIs has inherent support for querying, sorting and pagination</p>
          </div>
        </div>
        <div id="sections">
                <section id="api-Actions">
                  <h1>Actions</h1>
                    <div id="api-Actions-actionServiceCreateActionDefinition">
                      <article id="api-Actions-actionServiceCreateActionDefinition-0" data-group="User" data-name="actionServiceCreateActionDefinition" data-version="0">
                        <div class="pull-left">
                          <h1>actionServiceCreateActionDefinition</h1>
                          <p>Creates an action definition - Currently Not Supported</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/actions/{actionName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Actions-actionServiceCreateActionDefinition-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-java">Java</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Actions-actionServiceCreateActionDefinition-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/actions/{actionName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ActionsApi;

import java.io.File;
import java.util.*;

public class ActionsApiExample {

    public static void main(String[] args) {
        
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        ActionRequestSwagger body = ; // ActionRequestSwagger | 
        try {
            apiInstance.actionServiceCreateActionDefinition(actionName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceCreateActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ActionsApi;

public class ActionsApiExample {

    public static void main(String[] args) {
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        ActionRequestSwagger body = ; // ActionRequestSwagger | 
        try {
            apiInstance.actionServiceCreateActionDefinition(actionName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceCreateActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *actionName = actionName_example; // 
ActionRequestSwagger *body = ; //  (optional)

ActionsApi *apiInstance = [[ActionsApi alloc] init];

// Creates an action definition - Currently Not Supported
[apiInstance actionServiceCreateActionDefinitionWith:actionName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ActionsApi()

var actionName = actionName_example; // {String} 

var opts = { 
  'body':  // {ActionRequestSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.actionServiceCreateActionDefinition(actionName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class actionServiceCreateActionDefinitionExample
    {
        public void main()
        {
            
            var apiInstance = new ActionsApi();
            var actionName = actionName_example;  // String | 
            var body = new ActionRequestSwagger(); // ActionRequestSwagger |  (optional) 

            try
            {
                // Creates an action definition - Currently Not Supported
                apiInstance.actionServiceCreateActionDefinition(actionName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ActionsApi.actionServiceCreateActionDefinition: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ActionsApi();
$actionName = actionName_example; // String | 
$body = ; // ActionRequestSwagger | 

try {
    $api_instance->actionServiceCreateActionDefinition($actionName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ActionsApi->actionServiceCreateActionDefinition: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ActionsApi;

my $api_instance = WWW::SwaggerClient::ActionsApi->new();
my $actionName = actionName_example; # String | 
my $body = WWW::SwaggerClient::Object::ActionRequestSwagger->new(); # ActionRequestSwagger | 

eval { 
    $api_instance->actionServiceCreateActionDefinition(actionName => $actionName, body => $body);
};
if ($@) {
    warn "Exception when calling ActionsApi->actionServiceCreateActionDefinition: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ActionsApi()
actionName = actionName_example # String | 
body =  # ActionRequestSwagger |  (optional)

try: 
    # Creates an action definition - Currently Not Supported
    api_instance.actionServiceCreateActionDefinition(actionName, body=body)
except ApiException as e:
    print("Exception when calling ActionsApi->actionServiceCreateActionDefinition: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">actionName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "actionName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceCreateActionDefinition_actionName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceCreateActionDefinition_actionName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ActionRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_actionServiceCreateActionDefinition_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_actionServiceCreateActionDefinition_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 400 - Invalid request </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Actions-actionServiceDeleteActionDefinition">
                      <article id="api-Actions-actionServiceDeleteActionDefinition-0" data-group="User" data-name="actionServiceDeleteActionDefinition" data-version="0">
                        <div class="pull-left">
                          <h1>actionServiceDeleteActionDefinition</h1>
                          <p>Deletes an action definition - Currently Not Supported</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/actions/{actionName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-java">Java</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Actions-actionServiceDeleteActionDefinition-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/actions/{actionName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ActionsApi;

import java.io.File;
import java.util.*;

public class ActionsApiExample {

    public static void main(String[] args) {
        
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        try {
            apiInstance.actionServiceDeleteActionDefinition(actionName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceDeleteActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ActionsApi;

public class ActionsApiExample {

    public static void main(String[] args) {
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        try {
            apiInstance.actionServiceDeleteActionDefinition(actionName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceDeleteActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *actionName = actionName_example; // 

ActionsApi *apiInstance = [[ActionsApi alloc] init];

// Deletes an action definition - Currently Not Supported
[apiInstance actionServiceDeleteActionDefinitionWith:actionName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ActionsApi()

var actionName = actionName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.actionServiceDeleteActionDefinition(actionName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class actionServiceDeleteActionDefinitionExample
    {
        public void main()
        {
            
            var apiInstance = new ActionsApi();
            var actionName = actionName_example;  // String | 

            try
            {
                // Deletes an action definition - Currently Not Supported
                apiInstance.actionServiceDeleteActionDefinition(actionName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ActionsApi.actionServiceDeleteActionDefinition: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ActionsApi();
$actionName = actionName_example; // String | 

try {
    $api_instance->actionServiceDeleteActionDefinition($actionName);
} catch (Exception $e) {
    echo 'Exception when calling ActionsApi->actionServiceDeleteActionDefinition: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ActionsApi;

my $api_instance = WWW::SwaggerClient::ActionsApi->new();
my $actionName = actionName_example; # String | 

eval { 
    $api_instance->actionServiceDeleteActionDefinition(actionName => $actionName);
};
if ($@) {
    warn "Exception when calling ActionsApi->actionServiceDeleteActionDefinition: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ActionsApi()
actionName = actionName_example # String | 

try: 
    # Deletes an action definition - Currently Not Supported
    api_instance.actionServiceDeleteActionDefinition(actionName)
except ApiException as e:
    print("Exception when calling ActionsApi->actionServiceDeleteActionDefinition: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">actionName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "actionName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceDeleteActionDefinition_actionName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceDeleteActionDefinition_actionName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Actions-actionServiceGetActionDefinition">
                      <article id="api-Actions-actionServiceGetActionDefinition-0" data-group="User" data-name="actionServiceGetActionDefinition" data-version="0">
                        <div class="pull-left">
                          <h1>actionServiceGetActionDefinition</h1>
                          <p>Get the details of an action definition</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/actions/{actionName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Actions-actionServiceGetActionDefinition-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-java">Java</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Actions-actionServiceGetActionDefinition-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/actions/{actionName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ActionsApi;

import java.io.File;
import java.util.*;

public class ActionsApiExample {

    public static void main(String[] args) {
        
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ActionResponseSwagger result = apiInstance.actionServiceGetActionDefinition(actionName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceGetActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ActionsApi;

public class ActionsApiExample {

    public static void main(String[] args) {
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ActionResponseSwagger result = apiInstance.actionServiceGetActionDefinition(actionName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceGetActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *actionName = actionName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Actions/*)

ActionsApi *apiInstance = [[ActionsApi alloc] init];

// Get the details of an action definition
[apiInstance actionServiceGetActionDefinitionWith:actionName
    fields:fields
              completionHandler: ^(ActionResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ActionsApi()

var actionName = actionName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.actionServiceGetActionDefinition(actionName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class actionServiceGetActionDefinitionExample
    {
        public void main()
        {
            
            var apiInstance = new ActionsApi();
            var actionName = actionName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Actions/*)

            try
            {
                // Get the details of an action definition
                ActionResponseSwagger result = apiInstance.actionServiceGetActionDefinition(actionName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ActionsApi.actionServiceGetActionDefinition: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ActionsApi();
$actionName = actionName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->actionServiceGetActionDefinition($actionName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ActionsApi->actionServiceGetActionDefinition: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ActionsApi;

my $api_instance = WWW::SwaggerClient::ActionsApi->new();
my $actionName = actionName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->actionServiceGetActionDefinition(actionName => $actionName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ActionsApi->actionServiceGetActionDefinition: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ActionsApi()
actionName = actionName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Actions/*)

try: 
    # Get the details of an action definition
    api_response = api_instance.actionServiceGetActionDefinition(actionName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ActionsApi->actionServiceGetActionDefinition: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">actionName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "actionName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceGetActionDefinition_actionName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceGetActionDefinition_actionName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Actions/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceGetActionDefinition_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceGetActionDefinition_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-actionServiceGetActionDefinition-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-actionServiceGetActionDefinition-200-schema">
                                  <div id='responses-actionServiceGetActionDefinition-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ActionResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-actionServiceGetActionDefinition-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-actionServiceGetActionDefinition-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-actionServiceGetActionDefinition-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Actions-actionServiceGetActionDefinitions">
                      <article id="api-Actions-actionServiceGetActionDefinitions-0" data-group="User" data-name="actionServiceGetActionDefinitions" data-version="0">
                        <div class="pull-left">
                          <h1>actionServiceGetActionDefinitions</h1>
                          <p>Get all action definitions</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/actions</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Actions-actionServiceGetActionDefinitions-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-java">Java</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Actions-actionServiceGetActionDefinitions-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/actions?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ActionsApi;

import java.io.File;
import java.util.*;

public class ActionsApiExample {

    public static void main(String[] args) {
        
        ActionsApi apiInstance = new ActionsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ActionResponseSwagger] result = apiInstance.actionServiceGetActionDefinitions(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceGetActionDefinitions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ActionsApi;

public class ActionsApiExample {

    public static void main(String[] args) {
        ActionsApi apiInstance = new ActionsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ActionResponseSwagger] result = apiInstance.actionServiceGetActionDefinitions(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceGetActionDefinitions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Actions/action_name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Actions/action_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ActionsApi *apiInstance = [[ActionsApi alloc] init];

// Get all action definitions
[apiInstance actionServiceGetActionDefinitionsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ActionResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ActionsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.actionServiceGetActionDefinitions(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class actionServiceGetActionDefinitionsExample
    {
        public void main()
        {
            
            var apiInstance = new ActionsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Actions/action_name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Actions/action_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all action definitions
                array[ActionResponseSwagger] result = apiInstance.actionServiceGetActionDefinitions(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ActionsApi.actionServiceGetActionDefinitions: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ActionsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->actionServiceGetActionDefinitions($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ActionsApi->actionServiceGetActionDefinitions: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ActionsApi;

my $api_instance = WWW::SwaggerClient::ActionsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->actionServiceGetActionDefinitions(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ActionsApi->actionServiceGetActionDefinitions: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ActionsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Actions/action_name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Actions/action_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all action definitions
    api_response = api_instance.actionServiceGetActionDefinitions(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ActionsApi->actionServiceGetActionDefinitions: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Actions/action_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceGetActionDefinitions_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceGetActionDefinitions_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Actions/action_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceGetActionDefinitions_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceGetActionDefinitions_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceGetActionDefinitions_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceGetActionDefinitions_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceGetActionDefinitions_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceGetActionDefinitions_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceGetActionDefinitions_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceGetActionDefinitions_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-actionServiceGetActionDefinitions-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-actionServiceGetActionDefinitions-200-schema">
                                  <div id='responses-actionServiceGetActionDefinitions-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ActionResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-actionServiceGetActionDefinitions-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-actionServiceGetActionDefinitions-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-actionServiceGetActionDefinitions-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Actions-actionServiceUpdateActionDefinition">
                      <article id="api-Actions-actionServiceUpdateActionDefinition-0" data-group="User" data-name="actionServiceUpdateActionDefinition" data-version="0">
                        <div class="pull-left">
                          <h1>actionServiceUpdateActionDefinition</h1>
                          <p>Updates an action definition - Currently Not Supported</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/actions/{actionName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-java">Java</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Actions-actionServiceUpdateActionDefinition-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/actions/{actionName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ActionsApi;

import java.io.File;
import java.util.*;

public class ActionsApiExample {

    public static void main(String[] args) {
        
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        ActionRequestSwagger body = ; // ActionRequestSwagger | 
        try {
            apiInstance.actionServiceUpdateActionDefinition(actionName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceUpdateActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ActionsApi;

public class ActionsApiExample {

    public static void main(String[] args) {
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        ActionRequestSwagger body = ; // ActionRequestSwagger | 
        try {
            apiInstance.actionServiceUpdateActionDefinition(actionName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceUpdateActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *actionName = actionName_example; // 
ActionRequestSwagger *body = ; //  (optional)

ActionsApi *apiInstance = [[ActionsApi alloc] init];

// Updates an action definition - Currently Not Supported
[apiInstance actionServiceUpdateActionDefinitionWith:actionName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ActionsApi()

var actionName = actionName_example; // {String} 

var opts = { 
  'body':  // {ActionRequestSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.actionServiceUpdateActionDefinition(actionName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class actionServiceUpdateActionDefinitionExample
    {
        public void main()
        {
            
            var apiInstance = new ActionsApi();
            var actionName = actionName_example;  // String | 
            var body = new ActionRequestSwagger(); // ActionRequestSwagger |  (optional) 

            try
            {
                // Updates an action definition - Currently Not Supported
                apiInstance.actionServiceUpdateActionDefinition(actionName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ActionsApi.actionServiceUpdateActionDefinition: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ActionsApi();
$actionName = actionName_example; // String | 
$body = ; // ActionRequestSwagger | 

try {
    $api_instance->actionServiceUpdateActionDefinition($actionName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ActionsApi->actionServiceUpdateActionDefinition: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ActionsApi;

my $api_instance = WWW::SwaggerClient::ActionsApi->new();
my $actionName = actionName_example; # String | 
my $body = WWW::SwaggerClient::Object::ActionRequestSwagger->new(); # ActionRequestSwagger | 

eval { 
    $api_instance->actionServiceUpdateActionDefinition(actionName => $actionName, body => $body);
};
if ($@) {
    warn "Exception when calling ActionsApi->actionServiceUpdateActionDefinition: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ActionsApi()
actionName = actionName_example # String | 
body =  # ActionRequestSwagger |  (optional)

try: 
    # Updates an action definition - Currently Not Supported
    api_instance.actionServiceUpdateActionDefinition(actionName, body=body)
except ApiException as e:
    print("Exception when calling ActionsApi->actionServiceUpdateActionDefinition: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">actionName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "actionName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceUpdateActionDefinition_actionName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceUpdateActionDefinition_actionName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ActionRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_actionServiceUpdateActionDefinition_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_actionServiceUpdateActionDefinition_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 400 - Invalid request </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Alerts">
                  <h1>Alerts</h1>
                    <div id="api-Alerts-createTarget">
                      <article id="api-Alerts-createTarget-0" data-group="User" data-name="createTarget" data-version="0">
                        <div class="pull-left">
                          <h1>createTarget</h1>
                          <p>Creates an alert target</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/alert_targets</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Alerts-createTarget-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Alerts-createTarget-0-java">Java</a></li>
                          <li class=""><a href="#examples-Alerts-createTarget-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Alerts-createTarget-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Alerts-createTarget-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Alerts-createTarget-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Alerts-createTarget-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Alerts-createTarget-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Alerts-createTarget-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Alerts-createTarget-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Alerts-createTarget-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Alerts-createTarget-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/alert_targets?validateConfig=&overwriteExisting="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Alerts-createTarget-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.AlertsApi;

import java.io.File;
import java.util.*;

public class AlertsApiExample {

    public static void main(String[] args) {
        
        AlertsApi apiInstance = new AlertsApi();
        AlertTargetSwagger body = ; // AlertTargetSwagger | 
        String validateConfig = validateConfig_example; // String | 
        String overwriteExisting = overwriteExisting_example; // String | 
        try {
            apiInstance.createTarget(body, validateConfig, overwriteExisting);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#createTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Alerts-createTarget-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.AlertsApi;

public class AlertsApiExample {

    public static void main(String[] args) {
        AlertsApi apiInstance = new AlertsApi();
        AlertTargetSwagger body = ; // AlertTargetSwagger | 
        String validateConfig = validateConfig_example; // String | 
        String overwriteExisting = overwriteExisting_example; // String | 
        try {
            apiInstance.createTarget(body, validateConfig, overwriteExisting);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#createTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Alerts-createTarget-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Alerts-createTarget-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">AlertTargetSwagger *body = ; //  (optional)
String *validateConfig = validateConfig_example; //  (optional)
String *overwriteExisting = overwriteExisting_example; //  (optional)

AlertsApi *apiInstance = [[AlertsApi alloc] init];

// Creates an alert target
[apiInstance createTargetWith:body
    validateConfig:validateConfig
    overwriteExisting:overwriteExisting
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-createTarget-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.AlertsApi()

var opts = { 
  'body': , // {AlertTargetSwagger} 
  'validateConfig': validateConfig_example, // {String} 
  'overwriteExisting': overwriteExisting_example // {String} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createTarget(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Alerts-createTarget-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Alerts-createTarget-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createTargetExample
    {
        public void main()
        {
            
            var apiInstance = new AlertsApi();
            var body = new AlertTargetSwagger(); // AlertTargetSwagger |  (optional) 
            var validateConfig = validateConfig_example;  // String |  (optional) 
            var overwriteExisting = overwriteExisting_example;  // String |  (optional) 

            try
            {
                // Creates an alert target
                apiInstance.createTarget(body, validateConfig, overwriteExisting);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling AlertsApi.createTarget: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-createTarget-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\AlertsApi();
$body = ; // AlertTargetSwagger | 
$validateConfig = validateConfig_example; // String | 
$overwriteExisting = overwriteExisting_example; // String | 

try {
    $api_instance->createTarget($body, $validateConfig, $overwriteExisting);
} catch (Exception $e) {
    echo 'Exception when calling AlertsApi->createTarget: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-createTarget-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::AlertsApi;

my $api_instance = WWW::SwaggerClient::AlertsApi->new();
my $body = WWW::SwaggerClient::Object::AlertTargetSwagger->new(); # AlertTargetSwagger | 
my $validateConfig = validateConfig_example; # String | 
my $overwriteExisting = overwriteExisting_example; # String | 

eval { 
    $api_instance->createTarget(body => $body, validateConfig => $validateConfig, overwriteExisting => $overwriteExisting);
};
if ($@) {
    warn "Exception when calling AlertsApi->createTarget: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-createTarget-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.AlertsApi()
body =  # AlertTargetSwagger |  (optional)
validateConfig = validateConfig_example # String |  (optional)
overwriteExisting = overwriteExisting_example # String |  (optional)

try: 
    # Creates an alert target
    api_instance.createTarget(body=body, validateConfig=validateConfig, overwriteExisting=overwriteExisting)
except ApiException as e:
    print("Exception when calling AlertsApi->createTarget: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/AlertTargetSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createTarget_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createTarget_body"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">validate_config</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "validate_config",
  "in" : "query",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createTarget_validateConfig');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createTarget_validateConfig"></div>
</td>
</tr>

                                <tr><td style="width:150px;">overwrite_existing</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "overwrite_existing",
  "in" : "query",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createTarget_overwriteExisting');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createTarget_overwriteExisting"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Alerts-deleteTarget">
                      <article id="api-Alerts-deleteTarget-0" data-group="User" data-name="deleteTarget" data-version="0">
                        <div class="pull-left">
                          <h1>deleteTarget</h1>
                          <p>Deletes an alert target</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/alert_targets/{targetId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Alerts-deleteTarget-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-java">Java</a></li>
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Alerts-deleteTarget-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Alerts-deleteTarget-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Alerts-deleteTarget-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/alert_targets/{targetId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Alerts-deleteTarget-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.AlertsApi;

import java.io.File;
import java.util.*;

public class AlertsApiExample {

    public static void main(String[] args) {
        
        AlertsApi apiInstance = new AlertsApi();
        Long targetId = 789; // Long | 
        try {
            apiInstance.deleteTarget(targetId);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#deleteTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Alerts-deleteTarget-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.AlertsApi;

public class AlertsApiExample {

    public static void main(String[] args) {
        AlertsApi apiInstance = new AlertsApi();
        Long targetId = 789; // Long | 
        try {
            apiInstance.deleteTarget(targetId);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#deleteTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Alerts-deleteTarget-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Alerts-deleteTarget-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">Long *targetId = 789; // 

AlertsApi *apiInstance = [[AlertsApi alloc] init];

// Deletes an alert target
[apiInstance deleteTargetWith:targetId
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-deleteTarget-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.AlertsApi()

var targetId = 789; // {Long} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteTarget(targetId, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Alerts-deleteTarget-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Alerts-deleteTarget-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteTargetExample
    {
        public void main()
        {
            
            var apiInstance = new AlertsApi();
            var targetId = 789;  // Long | 

            try
            {
                // Deletes an alert target
                apiInstance.deleteTarget(targetId);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling AlertsApi.deleteTarget: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-deleteTarget-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\AlertsApi();
$targetId = 789; // Long | 

try {
    $api_instance->deleteTarget($targetId);
} catch (Exception $e) {
    echo 'Exception when calling AlertsApi->deleteTarget: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-deleteTarget-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::AlertsApi;

my $api_instance = WWW::SwaggerClient::AlertsApi->new();
my $targetId = 789; # Long | 

eval { 
    $api_instance->deleteTarget(targetId => $targetId);
};
if ($@) {
    warn "Exception when calling AlertsApi->deleteTarget: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-deleteTarget-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.AlertsApi()
targetId = 789 # Long | 

try: 
    # Deletes an alert target
    api_instance.deleteTarget(targetId)
except ApiException as e:
    print("Exception when calling AlertsApi->deleteTarget: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">targetId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "targetId",
  "in" : "path",
  "required" : true,
  "type" : "integer",
  "format" : "int64"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteTarget_targetId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteTarget_targetId"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Alerts-getTarget">
                      <article id="api-Alerts-getTarget-0" data-group="User" data-name="getTarget" data-version="0">
                        <div class="pull-left">
                          <h1>getTarget</h1>
                          <p>Returns a single alert target</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/alert_targets/{targetId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Alerts-getTarget-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Alerts-getTarget-0-java">Java</a></li>
                          <li class=""><a href="#examples-Alerts-getTarget-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Alerts-getTarget-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Alerts-getTarget-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Alerts-getTarget-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Alerts-getTarget-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Alerts-getTarget-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Alerts-getTarget-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Alerts-getTarget-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Alerts-getTarget-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Alerts-getTarget-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/alert_targets/{targetId}?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Alerts-getTarget-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.AlertsApi;

import java.io.File;
import java.util.*;

public class AlertsApiExample {

    public static void main(String[] args) {
        
        AlertsApi apiInstance = new AlertsApi();
        Long targetId = 789; // Long | alert target id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            AlertTargetSwagger result = apiInstance.getTarget(targetId, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#getTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Alerts-getTarget-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.AlertsApi;

public class AlertsApiExample {

    public static void main(String[] args) {
        AlertsApi apiInstance = new AlertsApi();
        Long targetId = 789; // Long | alert target id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            AlertTargetSwagger result = apiInstance.getTarget(targetId, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#getTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Alerts-getTarget-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Alerts-getTarget-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">Long *targetId = 789; // alert target id
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to AlertTarget/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

AlertsApi *apiInstance = [[AlertsApi alloc] init];

// Returns a single alert target
[apiInstance getTargetWith:targetId
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(AlertTargetSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTarget-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.AlertsApi()

var targetId = 789; // {Long} alert target id

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getTarget(targetId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Alerts-getTarget-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Alerts-getTarget-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getTargetExample
    {
        public void main()
        {
            
            var apiInstance = new AlertsApi();
            var targetId = 789;  // Long | alert target id
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to AlertTarget/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns a single alert target
                AlertTargetSwagger result = apiInstance.getTarget(targetId, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling AlertsApi.getTarget: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTarget-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\AlertsApi();
$targetId = 789; // Long | alert target id
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getTarget($targetId, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling AlertsApi->getTarget: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTarget-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::AlertsApi;

my $api_instance = WWW::SwaggerClient::AlertsApi->new();
my $targetId = 789; # Long | alert target id
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getTarget(targetId => $targetId, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling AlertsApi->getTarget: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTarget-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.AlertsApi()
targetId = 789 # Long | alert target id
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to AlertTarget/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns a single alert target
    api_response = api_instance.getTarget(targetId, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling AlertsApi->getTarget: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">targetId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "targetId",
  "in" : "path",
  "description" : "alert target id",
  "required" : true,
  "type" : "integer",
  "format" : "int64"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTarget_targetId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTarget_targetId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "AlertTarget/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTarget_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTarget_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTarget_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTarget_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTarget_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTarget_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTarget_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTarget_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTarget_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTarget_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getTarget-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getTarget-200-schema">
                                  <div id='responses-getTarget-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/AlertTargetSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getTarget-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getTarget-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getTarget-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Alerts-getTargets">
                      <article id="api-Alerts-getTargets-0" data-group="User" data-name="getTargets" data-version="0">
                        <div class="pull-left">
                          <h1>getTargets</h1>
                          <p>Returns all alert targets</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/alert_targets</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Alerts-getTargets-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Alerts-getTargets-0-java">Java</a></li>
                          <li class=""><a href="#examples-Alerts-getTargets-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Alerts-getTargets-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Alerts-getTargets-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Alerts-getTargets-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Alerts-getTargets-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Alerts-getTargets-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Alerts-getTargets-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Alerts-getTargets-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Alerts-getTargets-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Alerts-getTargets-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/alert_targets?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Alerts-getTargets-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.AlertsApi;

import java.io.File;
import java.util.*;

public class AlertsApiExample {

    public static void main(String[] args) {
        
        AlertsApi apiInstance = new AlertsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[AlertTargetSwagger] result = apiInstance.getTargets(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#getTargets");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Alerts-getTargets-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.AlertsApi;

public class AlertsApiExample {

    public static void main(String[] args) {
        AlertsApi apiInstance = new AlertsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[AlertTargetSwagger] result = apiInstance.getTargets(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#getTargets");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Alerts-getTargets-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Alerts-getTargets-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to AlertTarget/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

AlertsApi *apiInstance = [[AlertsApi alloc] init];

// Returns all alert targets
[apiInstance getTargetsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[AlertTargetSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTargets-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.AlertsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getTargets(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Alerts-getTargets-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Alerts-getTargets-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getTargetsExample
    {
        public void main()
        {
            
            var apiInstance = new AlertsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to AlertTarget/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns all alert targets
                array[AlertTargetSwagger] result = apiInstance.getTargets(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling AlertsApi.getTargets: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTargets-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\AlertsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getTargets($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling AlertsApi->getTargets: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTargets-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::AlertsApi;

my $api_instance = WWW::SwaggerClient::AlertsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getTargets(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling AlertsApi->getTargets: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTargets-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.AlertsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to AlertTarget/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns all alert targets
    api_response = api_instance.getTargets(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling AlertsApi->getTargets: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "AlertTarget/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTargets_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTargets_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTargets_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTargets_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTargets_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTargets_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTargets_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTargets_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTargets_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTargets_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getTargets-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getTargets-200-schema">
                                  <div id='responses-getTargets-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/AlertTargetSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getTargets-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getTargets-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getTargets-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Alerts-updateTarget">
                      <article id="api-Alerts-updateTarget-0" data-group="User" data-name="updateTarget" data-version="0">
                        <div class="pull-left">
                          <h1>updateTarget</h1>
                          <p>Updates an alert target</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/alert_targets/{targetId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Alerts-updateTarget-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Alerts-updateTarget-0-java">Java</a></li>
                          <li class=""><a href="#examples-Alerts-updateTarget-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Alerts-updateTarget-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Alerts-updateTarget-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Alerts-updateTarget-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Alerts-updateTarget-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Alerts-updateTarget-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Alerts-updateTarget-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Alerts-updateTarget-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Alerts-updateTarget-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Alerts-updateTarget-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/alert_targets/{targetId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Alerts-updateTarget-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.AlertsApi;

import java.io.File;
import java.util.*;

public class AlertsApiExample {

    public static void main(String[] args) {
        
        AlertsApi apiInstance = new AlertsApi();
        Long targetId = 789; // Long | 
        AlertTargetSwagger body = ; // AlertTargetSwagger | 
        try {
            apiInstance.updateTarget(targetId, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#updateTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Alerts-updateTarget-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.AlertsApi;

public class AlertsApiExample {

    public static void main(String[] args) {
        AlertsApi apiInstance = new AlertsApi();
        Long targetId = 789; // Long | 
        AlertTargetSwagger body = ; // AlertTargetSwagger | 
        try {
            apiInstance.updateTarget(targetId, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#updateTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Alerts-updateTarget-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Alerts-updateTarget-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">Long *targetId = 789; // 
AlertTargetSwagger *body = ; //  (optional)

AlertsApi *apiInstance = [[AlertsApi alloc] init];

// Updates an alert target
[apiInstance updateTargetWith:targetId
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-updateTarget-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.AlertsApi()

var targetId = 789; // {Long} 

var opts = { 
  'body':  // {AlertTargetSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateTarget(targetId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Alerts-updateTarget-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Alerts-updateTarget-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateTargetExample
    {
        public void main()
        {
            
            var apiInstance = new AlertsApi();
            var targetId = 789;  // Long | 
            var body = new AlertTargetSwagger(); // AlertTargetSwagger |  (optional) 

            try
            {
                // Updates an alert target
                apiInstance.updateTarget(targetId, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling AlertsApi.updateTarget: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-updateTarget-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\AlertsApi();
$targetId = 789; // Long | 
$body = ; // AlertTargetSwagger | 

try {
    $api_instance->updateTarget($targetId, $body);
} catch (Exception $e) {
    echo 'Exception when calling AlertsApi->updateTarget: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-updateTarget-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::AlertsApi;

my $api_instance = WWW::SwaggerClient::AlertsApi->new();
my $targetId = 789; # Long | 
my $body = WWW::SwaggerClient::Object::AlertTargetSwagger->new(); # AlertTargetSwagger | 

eval { 
    $api_instance->updateTarget(targetId => $targetId, body => $body);
};
if ($@) {
    warn "Exception when calling AlertsApi->updateTarget: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-updateTarget-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.AlertsApi()
targetId = 789 # Long | 
body =  # AlertTargetSwagger |  (optional)

try: 
    # Updates an alert target
    api_instance.updateTarget(targetId, body=body)
except ApiException as e:
    print("Exception when calling AlertsApi->updateTarget: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">targetId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "targetId",
  "in" : "path",
  "required" : true,
  "type" : "integer",
  "format" : "int64"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateTarget_targetId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateTarget_targetId"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/AlertTargetSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateTarget_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateTarget_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Blueprints">
                  <h1>Blueprints</h1>
                    <div id="api-Blueprints-blueprintServiceCreateBlueprint">
                      <article id="api-Blueprints-blueprintServiceCreateBlueprint-0" data-group="User" data-name="blueprintServiceCreateBlueprint" data-version="0">
                        <div class="pull-left">
                          <h1>blueprintServiceCreateBlueprint</h1>
                          <p>Creates a blueprint</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/blueprints/{blueprintName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-java">Java</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/blueprints/{blueprintName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.BlueprintsApi;

import java.io.File;
import java.util.*;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        
        BlueprintsApi apiInstance = new BlueprintsApi();
        String blueprintName = blueprintName_example; // String | 
        BlueprintSwagger body = ; // BlueprintSwagger | 
        try {
            apiInstance.blueprintServiceCreateBlueprint(blueprintName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceCreateBlueprint");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.BlueprintsApi;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        BlueprintsApi apiInstance = new BlueprintsApi();
        String blueprintName = blueprintName_example; // String | 
        BlueprintSwagger body = ; // BlueprintSwagger | 
        try {
            apiInstance.blueprintServiceCreateBlueprint(blueprintName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceCreateBlueprint");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *blueprintName = blueprintName_example; // 
BlueprintSwagger *body = ; //  (optional)

BlueprintsApi *apiInstance = [[BlueprintsApi alloc] init];

// Creates a blueprint
[apiInstance blueprintServiceCreateBlueprintWith:blueprintName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.BlueprintsApi()

var blueprintName = blueprintName_example; // {String} 

var opts = { 
  'body':  // {BlueprintSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.blueprintServiceCreateBlueprint(blueprintName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class blueprintServiceCreateBlueprintExample
    {
        public void main()
        {
            
            var apiInstance = new BlueprintsApi();
            var blueprintName = blueprintName_example;  // String | 
            var body = new BlueprintSwagger(); // BlueprintSwagger |  (optional) 

            try
            {
                // Creates a blueprint
                apiInstance.blueprintServiceCreateBlueprint(blueprintName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling BlueprintsApi.blueprintServiceCreateBlueprint: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\BlueprintsApi();
$blueprintName = blueprintName_example; // String | 
$body = ; // BlueprintSwagger | 

try {
    $api_instance->blueprintServiceCreateBlueprint($blueprintName, $body);
} catch (Exception $e) {
    echo 'Exception when calling BlueprintsApi->blueprintServiceCreateBlueprint: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::BlueprintsApi;

my $api_instance = WWW::SwaggerClient::BlueprintsApi->new();
my $blueprintName = blueprintName_example; # String | 
my $body = WWW::SwaggerClient::Object::BlueprintSwagger->new(); # BlueprintSwagger | 

eval { 
    $api_instance->blueprintServiceCreateBlueprint(blueprintName => $blueprintName, body => $body);
};
if ($@) {
    warn "Exception when calling BlueprintsApi->blueprintServiceCreateBlueprint: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.BlueprintsApi()
blueprintName = blueprintName_example # String | 
body =  # BlueprintSwagger |  (optional)

try: 
    # Creates a blueprint
    api_instance.blueprintServiceCreateBlueprint(blueprintName, body=body)
except ApiException as e:
    print("Exception when calling BlueprintsApi->blueprintServiceCreateBlueprint: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">blueprintName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "blueprintName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceCreateBlueprint_blueprintName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceCreateBlueprint_blueprintName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/BlueprintSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_blueprintServiceCreateBlueprint_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_blueprintServiceCreateBlueprint_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Blueprints-blueprintServiceDeleteBlueprint">
                      <article id="api-Blueprints-blueprintServiceDeleteBlueprint-0" data-group="User" data-name="blueprintServiceDeleteBlueprint" data-version="0">
                        <div class="pull-left">
                          <h1>blueprintServiceDeleteBlueprint</h1>
                          <p>Deletes a blueprint</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/blueprints/{blueprintName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-java">Java</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/blueprints/{blueprintName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.BlueprintsApi;

import java.io.File;
import java.util.*;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        
        BlueprintsApi apiInstance = new BlueprintsApi();
        String blueprintName = blueprintName_example; // String | 
        try {
            apiInstance.blueprintServiceDeleteBlueprint(blueprintName);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceDeleteBlueprint");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.BlueprintsApi;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        BlueprintsApi apiInstance = new BlueprintsApi();
        String blueprintName = blueprintName_example; // String | 
        try {
            apiInstance.blueprintServiceDeleteBlueprint(blueprintName);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceDeleteBlueprint");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *blueprintName = blueprintName_example; // 

BlueprintsApi *apiInstance = [[BlueprintsApi alloc] init];

// Deletes a blueprint
[apiInstance blueprintServiceDeleteBlueprintWith:blueprintName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.BlueprintsApi()

var blueprintName = blueprintName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.blueprintServiceDeleteBlueprint(blueprintName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class blueprintServiceDeleteBlueprintExample
    {
        public void main()
        {
            
            var apiInstance = new BlueprintsApi();
            var blueprintName = blueprintName_example;  // String | 

            try
            {
                // Deletes a blueprint
                apiInstance.blueprintServiceDeleteBlueprint(blueprintName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling BlueprintsApi.blueprintServiceDeleteBlueprint: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\BlueprintsApi();
$blueprintName = blueprintName_example; // String | 

try {
    $api_instance->blueprintServiceDeleteBlueprint($blueprintName);
} catch (Exception $e) {
    echo 'Exception when calling BlueprintsApi->blueprintServiceDeleteBlueprint: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::BlueprintsApi;

my $api_instance = WWW::SwaggerClient::BlueprintsApi->new();
my $blueprintName = blueprintName_example; # String | 

eval { 
    $api_instance->blueprintServiceDeleteBlueprint(blueprintName => $blueprintName);
};
if ($@) {
    warn "Exception when calling BlueprintsApi->blueprintServiceDeleteBlueprint: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.BlueprintsApi()
blueprintName = blueprintName_example # String | 

try: 
    # Deletes a blueprint
    api_instance.blueprintServiceDeleteBlueprint(blueprintName)
except ApiException as e:
    print("Exception when calling BlueprintsApi->blueprintServiceDeleteBlueprint: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">blueprintName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "blueprintName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceDeleteBlueprint_blueprintName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceDeleteBlueprint_blueprintName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Blueprints-blueprintServiceDeleteBlueprints">
                      <article id="api-Blueprints-blueprintServiceDeleteBlueprints-0" data-group="User" data-name="blueprintServiceDeleteBlueprints" data-version="0">
                        <div class="pull-left">
                          <h1>blueprintServiceDeleteBlueprints</h1>
                          <p>Deletes multiple blueprints that match the predicate. Omitting the predicate will delete all blueprints.</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/blueprints</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-java">Java</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/blueprints"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.BlueprintsApi;

import java.io.File;
import java.util.*;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        
        BlueprintsApi apiInstance = new BlueprintsApi();
        try {
            apiInstance.blueprintServiceDeleteBlueprints();
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceDeleteBlueprints");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.BlueprintsApi;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        BlueprintsApi apiInstance = new BlueprintsApi();
        try {
            apiInstance.blueprintServiceDeleteBlueprints();
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceDeleteBlueprints");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">
BlueprintsApi *apiInstance = [[BlueprintsApi alloc] init];

// Deletes multiple blueprints that match the predicate. Omitting the predicate will delete all blueprints.
[apiInstance blueprintServiceDeleteBlueprintsWithCompletionHandler: 
              ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.BlueprintsApi()

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.blueprintServiceDeleteBlueprints(callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class blueprintServiceDeleteBlueprintsExample
    {
        public void main()
        {
            
            var apiInstance = new BlueprintsApi();

            try
            {
                // Deletes multiple blueprints that match the predicate. Omitting the predicate will delete all blueprints.
                apiInstance.blueprintServiceDeleteBlueprints();
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling BlueprintsApi.blueprintServiceDeleteBlueprints: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\BlueprintsApi();

try {
    $api_instance->blueprintServiceDeleteBlueprints();
} catch (Exception $e) {
    echo 'Exception when calling BlueprintsApi->blueprintServiceDeleteBlueprints: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::BlueprintsApi;

my $api_instance = WWW::SwaggerClient::BlueprintsApi->new();

eval { 
    $api_instance->blueprintServiceDeleteBlueprints();
};
if ($@) {
    warn "Exception when calling BlueprintsApi->blueprintServiceDeleteBlueprints: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.BlueprintsApi()

try: 
    # Deletes multiple blueprints that match the predicate. Omitting the predicate will delete all blueprints.
    api_instance.blueprintServiceDeleteBlueprints()
except ApiException as e:
    print("Exception when calling BlueprintsApi->blueprintServiceDeleteBlueprints: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>






                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Blueprints-blueprintServiceGetBlueprint">
                      <article id="api-Blueprints-blueprintServiceGetBlueprint-0" data-group="User" data-name="blueprintServiceGetBlueprint" data-version="0">
                        <div class="pull-left">
                          <h1>blueprintServiceGetBlueprint</h1>
                          <p>Get the details of a blueprint</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/blueprints/{blueprintName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-java">Java</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Blueprints-blueprintServiceGetBlueprint-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/blueprints/{blueprintName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.BlueprintsApi;

import java.io.File;
import java.util.*;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        
        BlueprintsApi apiInstance = new BlueprintsApi();
        String blueprintName = blueprintName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[BlueprintSwagger] result = apiInstance.blueprintServiceGetBlueprint(blueprintName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceGetBlueprint");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.BlueprintsApi;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        BlueprintsApi apiInstance = new BlueprintsApi();
        String blueprintName = blueprintName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[BlueprintSwagger] result = apiInstance.blueprintServiceGetBlueprint(blueprintName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceGetBlueprint");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *blueprintName = blueprintName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Blueprints/*)

BlueprintsApi *apiInstance = [[BlueprintsApi alloc] init];

// Get the details of a blueprint
[apiInstance blueprintServiceGetBlueprintWith:blueprintName
    fields:fields
              completionHandler: ^(array[BlueprintSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.BlueprintsApi()

var blueprintName = blueprintName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.blueprintServiceGetBlueprint(blueprintName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class blueprintServiceGetBlueprintExample
    {
        public void main()
        {
            
            var apiInstance = new BlueprintsApi();
            var blueprintName = blueprintName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Blueprints/*)

            try
            {
                // Get the details of a blueprint
                array[BlueprintSwagger] result = apiInstance.blueprintServiceGetBlueprint(blueprintName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling BlueprintsApi.blueprintServiceGetBlueprint: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\BlueprintsApi();
$blueprintName = blueprintName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->blueprintServiceGetBlueprint($blueprintName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling BlueprintsApi->blueprintServiceGetBlueprint: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::BlueprintsApi;

my $api_instance = WWW::SwaggerClient::BlueprintsApi->new();
my $blueprintName = blueprintName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->blueprintServiceGetBlueprint(blueprintName => $blueprintName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling BlueprintsApi->blueprintServiceGetBlueprint: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.BlueprintsApi()
blueprintName = blueprintName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Blueprints/*)

try: 
    # Get the details of a blueprint
    api_response = api_instance.blueprintServiceGetBlueprint(blueprintName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling BlueprintsApi->blueprintServiceGetBlueprint: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">blueprintName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "blueprintName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceGetBlueprint_blueprintName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceGetBlueprint_blueprintName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Blueprints/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceGetBlueprint_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceGetBlueprint_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-blueprintServiceGetBlueprint-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-blueprintServiceGetBlueprint-200-schema">
                                  <div id='responses-blueprintServiceGetBlueprint-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/BlueprintSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-blueprintServiceGetBlueprint-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-blueprintServiceGetBlueprint-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-blueprintServiceGetBlueprint-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Blueprints-blueprintServiceGetBlueprints">
                      <article id="api-Blueprints-blueprintServiceGetBlueprints-0" data-group="User" data-name="blueprintServiceGetBlueprints" data-version="0">
                        <div class="pull-left">
                          <h1>blueprintServiceGetBlueprints</h1>
                          <p>Get all blueprints</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/blueprints</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-java">Java</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Blueprints-blueprintServiceGetBlueprints-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/blueprints?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.BlueprintsApi;

import java.io.File;
import java.util.*;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        
        BlueprintsApi apiInstance = new BlueprintsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[BlueprintSwagger] result = apiInstance.blueprintServiceGetBlueprints(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceGetBlueprints");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.BlueprintsApi;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        BlueprintsApi apiInstance = new BlueprintsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[BlueprintSwagger] result = apiInstance.blueprintServiceGetBlueprints(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceGetBlueprints");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Blueprints/blueprint_name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Blueprints/blueprint_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

BlueprintsApi *apiInstance = [[BlueprintsApi alloc] init];

// Get all blueprints
[apiInstance blueprintServiceGetBlueprintsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[BlueprintSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.BlueprintsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.blueprintServiceGetBlueprints(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class blueprintServiceGetBlueprintsExample
    {
        public void main()
        {
            
            var apiInstance = new BlueprintsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Blueprints/blueprint_name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Blueprints/blueprint_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all blueprints
                array[BlueprintSwagger] result = apiInstance.blueprintServiceGetBlueprints(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling BlueprintsApi.blueprintServiceGetBlueprints: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\BlueprintsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->blueprintServiceGetBlueprints($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling BlueprintsApi->blueprintServiceGetBlueprints: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::BlueprintsApi;

my $api_instance = WWW::SwaggerClient::BlueprintsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->blueprintServiceGetBlueprints(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling BlueprintsApi->blueprintServiceGetBlueprints: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.BlueprintsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Blueprints/blueprint_name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Blueprints/blueprint_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all blueprints
    api_response = api_instance.blueprintServiceGetBlueprints(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling BlueprintsApi->blueprintServiceGetBlueprints: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Blueprints/blueprint_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceGetBlueprints_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceGetBlueprints_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Blueprints/blueprint_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceGetBlueprints_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceGetBlueprints_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceGetBlueprints_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceGetBlueprints_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceGetBlueprints_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceGetBlueprints_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceGetBlueprints_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceGetBlueprints_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-blueprintServiceGetBlueprints-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-blueprintServiceGetBlueprints-200-schema">
                                  <div id='responses-blueprintServiceGetBlueprints-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/BlueprintSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-blueprintServiceGetBlueprints-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-blueprintServiceGetBlueprints-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-blueprintServiceGetBlueprints-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-ClusterServices">
                  <h1>ClusterServices</h1>
                    <div id="api-ClusterServices-serviceServiceCreateArtifact">
                      <article id="api-ClusterServices-serviceServiceCreateArtifact-0" data-group="User" data-name="serviceServiceCreateArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceCreateArtifact</h1>
                          <p>Creates a service artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceCreateArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ClusterServiceArtifactRequest body = ; // ClusterServiceArtifactRequest | 
        try {
            apiInstance.serviceServiceCreateArtifact(serviceName, artifactName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceCreateArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ClusterServiceArtifactRequest body = ; // ClusterServiceArtifactRequest | 
        try {
            apiInstance.serviceServiceCreateArtifact(serviceName, artifactName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceCreateArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *artifactName = artifactName_example; // 
String *clusterName = clusterName_example; // 
ClusterServiceArtifactRequest *body = ; //  (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Creates a service artifact
[apiInstance serviceServiceCreateArtifactWith:serviceName
    artifactName:artifactName
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ClusterServiceArtifactRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceCreateArtifact(serviceName, artifactName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceCreateArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ClusterServiceArtifactRequest(); // ClusterServiceArtifactRequest |  (optional) 

            try
            {
                // Creates a service artifact
                apiInstance.serviceServiceCreateArtifact(serviceName, artifactName, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceCreateArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$artifactName = artifactName_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ClusterServiceArtifactRequest | 

try {
    $api_instance->serviceServiceCreateArtifact($serviceName, $artifactName, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceCreateArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterServiceArtifactRequest->new(); # ClusterServiceArtifactRequest | 

eval { 
    $api_instance->serviceServiceCreateArtifact(serviceName => $serviceName, artifactName => $artifactName, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceCreateArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
artifactName = artifactName_example # String | 
clusterName = clusterName_example # String | 
body =  # ClusterServiceArtifactRequest |  (optional)

try: 
    # Creates a service artifact
    api_instance.serviceServiceCreateArtifact(serviceName, artifactName, clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceCreateArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceCreateArtifact_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceCreateArtifact_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceCreateArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceCreateArtifact_artifactName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceCreateArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceCreateArtifact_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterServiceArtifactRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_serviceServiceCreateArtifact_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_serviceServiceCreateArtifact_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceCreateServices">
                      <article id="api-ClusterServices-serviceServiceCreateServices-0" data-group="User" data-name="serviceServiceCreateServices" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceCreateServices</h1>
                          <p>Creates a service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceCreateServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceCreateServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceRequestSwagger body = ; // ServiceRequestSwagger | 
        try {
            apiInstance.serviceServiceCreateServices(serviceName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceCreateServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceRequestSwagger body = ; // ServiceRequestSwagger | 
        try {
            apiInstance.serviceServiceCreateServices(serviceName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceCreateServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *clusterName = clusterName_example; // 
ServiceRequestSwagger *body = ; //  (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Creates a service
[apiInstance serviceServiceCreateServicesWith:serviceName
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ServiceRequestSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceCreateServices(serviceName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceCreateServicesExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ServiceRequestSwagger(); // ServiceRequestSwagger |  (optional) 

            try
            {
                // Creates a service
                apiInstance.serviceServiceCreateServices(serviceName, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceCreateServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ServiceRequestSwagger | 

try {
    $api_instance->serviceServiceCreateServices($serviceName, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceCreateServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ServiceRequestSwagger->new(); # ServiceRequestSwagger | 

eval { 
    $api_instance->serviceServiceCreateServices(serviceName => $serviceName, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceCreateServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
clusterName = clusterName_example # String | 
body =  # ServiceRequestSwagger |  (optional)

try: 
    # Creates a service
    api_instance.serviceServiceCreateServices(serviceName, clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceCreateServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceCreateServices_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceCreateServices_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceCreateServices_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceCreateServices_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ServiceRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_serviceServiceCreateServices_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_serviceServiceCreateServices_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceDeleteArtifact">
                      <article id="api-ClusterServices-serviceServiceDeleteArtifact-0" data-group="User" data-name="serviceServiceDeleteArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceDeleteArtifact</h1>
                          <p>Deletes a single service artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.serviceServiceDeleteArtifact(serviceName, artifactName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceDeleteArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.serviceServiceDeleteArtifact(serviceName, artifactName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceDeleteArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *artifactName = artifactName_example; // 
String *clusterName = clusterName_example; // 

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Deletes a single service artifact
[apiInstance serviceServiceDeleteArtifactWith:serviceName
    artifactName:artifactName
    clusterName:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceDeleteArtifact(serviceName, artifactName, clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceDeleteArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Deletes a single service artifact
                apiInstance.serviceServiceDeleteArtifact(serviceName, artifactName, clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceDeleteArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$artifactName = artifactName_example; // String | 
$clusterName = clusterName_example; // String | 

try {
    $api_instance->serviceServiceDeleteArtifact($serviceName, $artifactName, $clusterName);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceDeleteArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->serviceServiceDeleteArtifact(serviceName => $serviceName, artifactName => $artifactName, clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceDeleteArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
artifactName = artifactName_example # String | 
clusterName = clusterName_example # String | 

try: 
    # Deletes a single service artifact
    api_instance.serviceServiceDeleteArtifact(serviceName, artifactName, clusterName)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceDeleteArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceDeleteArtifact_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceDeleteArtifact_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceDeleteArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceDeleteArtifact_artifactName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceDeleteArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceDeleteArtifact_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceDeleteArtifacts">
                      <article id="api-ClusterServices-serviceServiceDeleteArtifacts-0" data-group="User" data-name="serviceServiceDeleteArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceDeleteArtifacts</h1>
                          <p>Deletes all artifacts of a service that match the provided predicate</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}/artifacts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.serviceServiceDeleteArtifacts(serviceName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceDeleteArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.serviceServiceDeleteArtifacts(serviceName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceDeleteArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *clusterName = clusterName_example; // 

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Deletes all artifacts of a service that match the provided predicate
[apiInstance serviceServiceDeleteArtifactsWith:serviceName
    clusterName:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceDeleteArtifacts(serviceName, clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceDeleteArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Deletes all artifacts of a service that match the provided predicate
                apiInstance.serviceServiceDeleteArtifacts(serviceName, clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceDeleteArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$clusterName = clusterName_example; // String | 

try {
    $api_instance->serviceServiceDeleteArtifacts($serviceName, $clusterName);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceDeleteArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->serviceServiceDeleteArtifacts(serviceName => $serviceName, clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceDeleteArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
clusterName = clusterName_example # String | 

try: 
    # Deletes all artifacts of a service that match the provided predicate
    api_instance.serviceServiceDeleteArtifacts(serviceName, clusterName)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceDeleteArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceDeleteArtifacts_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceDeleteArtifacts_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceDeleteArtifacts_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceDeleteArtifacts_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceDeleteService">
                      <article id="api-ClusterServices-serviceServiceDeleteService-0" data-group="User" data-name="serviceServiceDeleteService" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceDeleteService</h1>
                          <p>Deletes a service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceDeleteService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceDeleteService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.serviceServiceDeleteService(serviceName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceDeleteService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.serviceServiceDeleteService(serviceName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceDeleteService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *clusterName = clusterName_example; // 

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Deletes a service
[apiInstance serviceServiceDeleteServiceWith:serviceName
    clusterName:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceDeleteService(serviceName, clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceDeleteServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Deletes a service
                apiInstance.serviceServiceDeleteService(serviceName, clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceDeleteService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$clusterName = clusterName_example; // String | 

try {
    $api_instance->serviceServiceDeleteService($serviceName, $clusterName);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceDeleteService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->serviceServiceDeleteService(serviceName => $serviceName, clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceDeleteService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
clusterName = clusterName_example # String | 

try: 
    # Deletes a service
    api_instance.serviceServiceDeleteService(serviceName, clusterName)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceDeleteService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceDeleteService_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceDeleteService_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceDeleteService_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceDeleteService_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceGetArtifact">
                      <article id="api-ClusterServices-serviceServiceGetArtifact-0" data-group="User" data-name="serviceServiceGetArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceGetArtifact</h1>
                          <p>Get the details of a service artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceGetArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterServiceArtifactResponse] result = apiInstance.serviceServiceGetArtifact(serviceName, artifactName, clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterServiceArtifactResponse] result = apiInstance.serviceServiceGetArtifact(serviceName, artifactName, clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *artifactName = artifactName_example; // 
String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Artifacts/artifact_name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Artifacts/artifact_name)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Get the details of a service artifact
[apiInstance serviceServiceGetArtifactWith:serviceName
    artifactName:artifactName
    clusterName:clusterName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ClusterServiceArtifactResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.serviceServiceGetArtifact(serviceName, artifactName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceGetArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Artifacts/artifact_name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Artifacts/artifact_name)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get the details of a service artifact
                array[ClusterServiceArtifactResponse] result = apiInstance.serviceServiceGetArtifact(serviceName, artifactName, clusterName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceGetArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$artifactName = artifactName_example; // String | 
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->serviceServiceGetArtifact($serviceName, $artifactName, $clusterName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceGetArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->serviceServiceGetArtifact(serviceName => $serviceName, artifactName => $artifactName, clusterName => $clusterName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceGetArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
artifactName = artifactName_example # String | 
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Artifacts/artifact_name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Artifacts/artifact_name)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get the details of a service artifact
    api_response = api_instance.serviceServiceGetArtifact(serviceName, artifactName, clusterName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceGetArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_artifactName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/artifact_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/artifact_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-serviceServiceGetArtifact-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-serviceServiceGetArtifact-200-schema">
                                  <div id='responses-serviceServiceGetArtifact-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ClusterServiceArtifactResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-serviceServiceGetArtifact-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-serviceServiceGetArtifact-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-serviceServiceGetArtifact-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceGetArtifacts">
                      <article id="api-ClusterServices-serviceServiceGetArtifacts-0" data-group="User" data-name="serviceServiceGetArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceGetArtifacts</h1>
                          <p>Get all service artifacts</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceGetArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}/artifacts?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterServiceArtifactResponse] result = apiInstance.serviceServiceGetArtifacts(serviceName, clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterServiceArtifactResponse] result = apiInstance.serviceServiceGetArtifacts(serviceName, clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Artifacts/artifact_name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Artifacts/artifact_name)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Get all service artifacts
[apiInstance serviceServiceGetArtifactsWith:serviceName
    clusterName:clusterName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ClusterServiceArtifactResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.serviceServiceGetArtifacts(serviceName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceGetArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Artifacts/artifact_name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Artifacts/artifact_name)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all service artifacts
                array[ClusterServiceArtifactResponse] result = apiInstance.serviceServiceGetArtifacts(serviceName, clusterName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceGetArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->serviceServiceGetArtifacts($serviceName, $clusterName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceGetArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->serviceServiceGetArtifacts(serviceName => $serviceName, clusterName => $clusterName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceGetArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Artifacts/artifact_name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Artifacts/artifact_name)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all service artifacts
    api_response = api_instance.serviceServiceGetArtifacts(serviceName, clusterName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceGetArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifacts_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifacts_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifacts_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifacts_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/artifact_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifacts_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifacts_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/artifact_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifacts_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifacts_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifacts_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifacts_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifacts_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifacts_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifacts_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifacts_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-serviceServiceGetArtifacts-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-serviceServiceGetArtifacts-200-schema">
                                  <div id='responses-serviceServiceGetArtifacts-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ClusterServiceArtifactResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-serviceServiceGetArtifacts-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-serviceServiceGetArtifacts-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-serviceServiceGetArtifacts-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceGetService">
                      <article id="api-ClusterServices-serviceServiceGetService-0" data-group="User" data-name="serviceServiceGetService" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceGetService</h1>
                          <p>Get the details of a service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the details of a service.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceGetService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceGetService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[ServiceResponseSwagger] result = apiInstance.serviceServiceGetService(serviceName, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[ServiceResponseSwagger] result = apiInstance.serviceServiceGetService(serviceName, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ServiceInfo/*)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Get the details of a service
[apiInstance serviceServiceGetServiceWith:serviceName
    clusterName:clusterName
    fields:fields
              completionHandler: ^(array[ServiceResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.serviceServiceGetService(serviceName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceGetServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ServiceInfo/*)

            try
            {
                // Get the details of a service
                array[ServiceResponseSwagger] result = apiInstance.serviceServiceGetService(serviceName, clusterName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceGetService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->serviceServiceGetService($serviceName, $clusterName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceGetService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->serviceServiceGetService(serviceName => $serviceName, clusterName => $clusterName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceGetService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ServiceInfo/*)

try: 
    # Get the details of a service
    api_response = api_instance.serviceServiceGetService(serviceName, clusterName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceGetService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetService_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetService_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetService_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetService_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ServiceInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetService_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetService_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-serviceServiceGetService-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-serviceServiceGetService-200-schema">
                                  <div id='responses-serviceServiceGetService-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ServiceResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-serviceServiceGetService-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-serviceServiceGetService-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-serviceServiceGetService-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceGetServices">
                      <article id="api-ClusterServices-serviceServiceGetServices-0" data-group="User" data-name="serviceServiceGetServices" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceGetServices</h1>
                          <p>Get all services</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all services.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/services</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceGetServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceGetServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/services?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ServiceResponseSwagger] result = apiInstance.serviceServiceGetServices(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ServiceResponseSwagger] result = apiInstance.serviceServiceGetServices(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ServiceInfo/service_name,ServiceInfo/cluster_name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to ServiceInfo/service_name.asc,ServiceInfo/cluster_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Get all services
[apiInstance serviceServiceGetServicesWith:clusterName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ServiceResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.serviceServiceGetServices(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceGetServicesExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ServiceInfo/service_name,ServiceInfo/cluster_name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to ServiceInfo/service_name.asc,ServiceInfo/cluster_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all services
                array[ServiceResponseSwagger] result = apiInstance.serviceServiceGetServices(clusterName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceGetServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->serviceServiceGetServices($clusterName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceGetServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->serviceServiceGetServices(clusterName => $clusterName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceGetServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ServiceInfo/service_name,ServiceInfo/cluster_name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to ServiceInfo/service_name.asc,ServiceInfo/cluster_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all services
    api_response = api_instance.serviceServiceGetServices(clusterName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceGetServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetServices_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetServices_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ServiceInfo/service_name,ServiceInfo/cluster_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetServices_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetServices_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "ServiceInfo/service_name.asc,ServiceInfo/cluster_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetServices_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetServices_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetServices_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetServices_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetServices_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetServices_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetServices_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetServices_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-serviceServiceGetServices-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-serviceServiceGetServices-200-schema">
                                  <div id='responses-serviceServiceGetServices-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ServiceResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-serviceServiceGetServices-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-serviceServiceGetServices-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-serviceServiceGetServices-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceUpdateArtifact">
                      <article id="api-ClusterServices-serviceServiceUpdateArtifact-0" data-group="User" data-name="serviceServiceUpdateArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceUpdateArtifact</h1>
                          <p>Updates a single artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ClusterServiceArtifactRequest body = ; // ClusterServiceArtifactRequest | 
        try {
            apiInstance.serviceServiceUpdateArtifact(serviceName, artifactName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceUpdateArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ClusterServiceArtifactRequest body = ; // ClusterServiceArtifactRequest | 
        try {
            apiInstance.serviceServiceUpdateArtifact(serviceName, artifactName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceUpdateArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *artifactName = artifactName_example; // 
String *clusterName = clusterName_example; // 
ClusterServiceArtifactRequest *body = ; //  (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Updates a single artifact
[apiInstance serviceServiceUpdateArtifactWith:serviceName
    artifactName:artifactName
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ClusterServiceArtifactRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceUpdateArtifact(serviceName, artifactName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceUpdateArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ClusterServiceArtifactRequest(); // ClusterServiceArtifactRequest |  (optional) 

            try
            {
                // Updates a single artifact
                apiInstance.serviceServiceUpdateArtifact(serviceName, artifactName, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceUpdateArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$artifactName = artifactName_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ClusterServiceArtifactRequest | 

try {
    $api_instance->serviceServiceUpdateArtifact($serviceName, $artifactName, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceUpdateArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterServiceArtifactRequest->new(); # ClusterServiceArtifactRequest | 

eval { 
    $api_instance->serviceServiceUpdateArtifact(serviceName => $serviceName, artifactName => $artifactName, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceUpdateArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
artifactName = artifactName_example # String | 
clusterName = clusterName_example # String | 
body =  # ClusterServiceArtifactRequest |  (optional)

try: 
    # Updates a single artifact
    api_instance.serviceServiceUpdateArtifact(serviceName, artifactName, clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceUpdateArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceUpdateArtifact_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceUpdateArtifact_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceUpdateArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceUpdateArtifact_artifactName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceUpdateArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceUpdateArtifact_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterServiceArtifactRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_serviceServiceUpdateArtifact_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_serviceServiceUpdateArtifact_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceUpdateArtifacts">
                      <article id="api-ClusterServices-serviceServiceUpdateArtifacts-0" data-group="User" data-name="serviceServiceUpdateArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceUpdateArtifacts</h1>
                          <p>Updates multiple artifacts</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}/artifacts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ClusterServiceArtifactRequest body = ; // ClusterServiceArtifactRequest | 
        try {
            apiInstance.serviceServiceUpdateArtifacts(serviceName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceUpdateArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ClusterServiceArtifactRequest body = ; // ClusterServiceArtifactRequest | 
        try {
            apiInstance.serviceServiceUpdateArtifacts(serviceName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceUpdateArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *clusterName = clusterName_example; // 
ClusterServiceArtifactRequest *body = ; //  (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Updates multiple artifacts
[apiInstance serviceServiceUpdateArtifactsWith:serviceName
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ClusterServiceArtifactRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceUpdateArtifacts(serviceName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceUpdateArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ClusterServiceArtifactRequest(); // ClusterServiceArtifactRequest |  (optional) 

            try
            {
                // Updates multiple artifacts
                apiInstance.serviceServiceUpdateArtifacts(serviceName, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceUpdateArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ClusterServiceArtifactRequest | 

try {
    $api_instance->serviceServiceUpdateArtifacts($serviceName, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceUpdateArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterServiceArtifactRequest->new(); # ClusterServiceArtifactRequest | 

eval { 
    $api_instance->serviceServiceUpdateArtifacts(serviceName => $serviceName, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceUpdateArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
clusterName = clusterName_example # String | 
body =  # ClusterServiceArtifactRequest |  (optional)

try: 
    # Updates multiple artifacts
    api_instance.serviceServiceUpdateArtifacts(serviceName, clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceUpdateArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceUpdateArtifacts_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceUpdateArtifacts_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceUpdateArtifacts_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceUpdateArtifacts_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterServiceArtifactRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_serviceServiceUpdateArtifacts_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_serviceServiceUpdateArtifacts_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceUpdateService">
                      <article id="api-ClusterServices-serviceServiceUpdateService-0" data-group="User" data-name="serviceServiceUpdateService" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceUpdateService</h1>
                          <p>Updates a service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceUpdateService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceUpdateService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceRequestSwagger body = ; // ServiceRequestSwagger | 
        try {
            apiInstance.serviceServiceUpdateService(serviceName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceUpdateService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceRequestSwagger body = ; // ServiceRequestSwagger | 
        try {
            apiInstance.serviceServiceUpdateService(serviceName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceUpdateService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *clusterName = clusterName_example; // 
ServiceRequestSwagger *body = ; //  (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Updates a service
[apiInstance serviceServiceUpdateServiceWith:serviceName
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ServiceRequestSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceUpdateService(serviceName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceUpdateServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ServiceRequestSwagger(); // ServiceRequestSwagger |  (optional) 

            try
            {
                // Updates a service
                apiInstance.serviceServiceUpdateService(serviceName, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceUpdateService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ServiceRequestSwagger | 

try {
    $api_instance->serviceServiceUpdateService($serviceName, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceUpdateService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ServiceRequestSwagger->new(); # ServiceRequestSwagger | 

eval { 
    $api_instance->serviceServiceUpdateService(serviceName => $serviceName, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceUpdateService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
clusterName = clusterName_example # String | 
body =  # ServiceRequestSwagger |  (optional)

try: 
    # Updates a service
    api_instance.serviceServiceUpdateService(serviceName, clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceUpdateService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceUpdateService_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceUpdateService_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceUpdateService_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceUpdateService_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ServiceRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_serviceServiceUpdateService_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_serviceServiceUpdateService_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Clusters">
                  <h1>Clusters</h1>
                    <div id="api-Clusters-createCluster">
                      <article id="api-Clusters-createCluster-0" data-group="User" data-name="createCluster" data-version="0">
                        <div class="pull-left">
                          <h1>createCluster</h1>
                          <p>Creates a cluster</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-createCluster-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-createCluster-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-createCluster-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-createCluster-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-createCluster-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-createCluster-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-createCluster-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-createCluster-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-createCluster-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-createCluster-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-createCluster-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-createCluster-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-createCluster-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        ClusterRequestSwagger body = ; // ClusterRequestSwagger | 
        try {
            apiInstance.createCluster(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#createCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-createCluster-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        ClusterRequestSwagger body = ; // ClusterRequestSwagger | 
        try {
            apiInstance.createCluster(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#createCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-createCluster-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-createCluster-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
ClusterRequestSwagger *body = ; //  (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Creates a cluster
[apiInstance createClusterWith:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createCluster-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ClusterRequestSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createCluster(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-createCluster-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-createCluster-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createClusterExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var body = new ClusterRequestSwagger(); // ClusterRequestSwagger |  (optional) 

            try
            {
                // Creates a cluster
                apiInstance.createCluster(clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.createCluster: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createCluster-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$body = ; // ClusterRequestSwagger | 

try {
    $api_instance->createCluster($clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->createCluster: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createCluster-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterRequestSwagger->new(); # ClusterRequestSwagger | 

eval { 
    $api_instance->createCluster(clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClustersApi->createCluster: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createCluster-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
body =  # ClusterRequestSwagger |  (optional)

try: 
    # Creates a cluster
    api_instance.createCluster(clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClustersApi->createCluster: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createCluster_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createCluster_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createCluster_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createCluster_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-createClusterArtifact">
                      <article id="api-Clusters-createClusterArtifact-0" data-group="User" data-name="createClusterArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>createClusterArtifact</h1>
                          <p>Creates a cluster artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-createClusterArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-createClusterArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-createClusterArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-createClusterArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}/artifacts/{artifactName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        ClusterArtifactRequest body = ; // ClusterArtifactRequest | 
        try {
            apiInstance.createClusterArtifact(clusterName, artifactName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#createClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        ClusterArtifactRequest body = ; // ClusterArtifactRequest | 
        try {
            apiInstance.createClusterArtifact(clusterName, artifactName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#createClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *artifactName = artifactName_example; // 
ClusterArtifactRequest *body = ; //  (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Creates a cluster artifact
[apiInstance createClusterArtifactWith:clusterName
    artifactName:artifactName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var opts = { 
  'body':  // {ClusterArtifactRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createClusterArtifact(clusterName, artifactName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createClusterArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var body = new ClusterArtifactRequest(); // ClusterArtifactRequest |  (optional) 

            try
            {
                // Creates a cluster artifact
                apiInstance.createClusterArtifact(clusterName, artifactName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.createClusterArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$artifactName = artifactName_example; // String | 
$body = ; // ClusterArtifactRequest | 

try {
    $api_instance->createClusterArtifact($clusterName, $artifactName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->createClusterArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterArtifactRequest->new(); # ClusterArtifactRequest | 

eval { 
    $api_instance->createClusterArtifact(clusterName => $clusterName, artifactName => $artifactName, body => $body);
};
if ($@) {
    warn "Exception when calling ClustersApi->createClusterArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
artifactName = artifactName_example # String | 
body =  # ClusterArtifactRequest |  (optional)

try: 
    # Creates a cluster artifact
    api_instance.createClusterArtifact(clusterName, artifactName, body=body)
except ApiException as e:
    print("Exception when calling ClustersApi->createClusterArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createClusterArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createClusterArtifact_clusterName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createClusterArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createClusterArtifact_artifactName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterArtifactRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createClusterArtifact_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createClusterArtifact_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-deleteCluster">
                      <article id="api-Clusters-deleteCluster-0" data-group="User" data-name="deleteCluster" data-version="0">
                        <div class="pull-left">
                          <h1>deleteCluster</h1>
                          <p>Deletes a cluster</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-deleteCluster-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-deleteCluster-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-deleteCluster-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-deleteCluster-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-deleteCluster-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteCluster(clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#deleteCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-deleteCluster-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteCluster(clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#deleteCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-deleteCluster-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-deleteCluster-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Deletes a cluster
[apiInstance deleteClusterWith:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteCluster-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteCluster(clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-deleteCluster-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-deleteCluster-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteClusterExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Deletes a cluster
                apiInstance.deleteCluster(clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.deleteCluster: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteCluster-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 

try {
    $api_instance->deleteCluster($clusterName);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->deleteCluster: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteCluster-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->deleteCluster(clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling ClustersApi->deleteCluster: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteCluster-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 

try: 
    # Deletes a cluster
    api_instance.deleteCluster(clusterName)
except ApiException as e:
    print("Exception when calling ClustersApi->deleteCluster: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteCluster_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteCluster_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-deleteClusterArtifact">
                      <article id="api-Clusters-deleteClusterArtifact-0" data-group="User" data-name="deleteClusterArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>deleteClusterArtifact</h1>
                          <p>Deletes a single artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-deleteClusterArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-deleteClusterArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/artifacts/{artifactName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        try {
            apiInstance.deleteClusterArtifact(clusterName, artifactName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#deleteClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        try {
            apiInstance.deleteClusterArtifact(clusterName, artifactName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#deleteClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *artifactName = artifactName_example; // 

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Deletes a single artifact
[apiInstance deleteClusterArtifactWith:clusterName
    artifactName:artifactName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var artifactName = artifactName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteClusterArtifact(clusterName, artifactName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteClusterArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var artifactName = artifactName_example;  // String | 

            try
            {
                // Deletes a single artifact
                apiInstance.deleteClusterArtifact(clusterName, artifactName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.deleteClusterArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$artifactName = artifactName_example; // String | 

try {
    $api_instance->deleteClusterArtifact($clusterName, $artifactName);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->deleteClusterArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $artifactName = artifactName_example; # String | 

eval { 
    $api_instance->deleteClusterArtifact(clusterName => $clusterName, artifactName => $artifactName);
};
if ($@) {
    warn "Exception when calling ClustersApi->deleteClusterArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
artifactName = artifactName_example # String | 

try: 
    # Deletes a single artifact
    api_instance.deleteClusterArtifact(clusterName, artifactName)
except ApiException as e:
    print("Exception when calling ClustersApi->deleteClusterArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteClusterArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteClusterArtifact_clusterName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteClusterArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteClusterArtifact_artifactName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-deleteClusterArtifacts">
                      <article id="api-Clusters-deleteClusterArtifacts-0" data-group="User" data-name="deleteClusterArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>deleteClusterArtifacts</h1>
                          <p>Deletes all artifacts of a cluster that match the provided predicate</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-deleteClusterArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-deleteClusterArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/artifacts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteClusterArtifacts(clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#deleteClusterArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteClusterArtifacts(clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#deleteClusterArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Deletes all artifacts of a cluster that match the provided predicate
[apiInstance deleteClusterArtifactsWith:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteClusterArtifacts(clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteClusterArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Deletes all artifacts of a cluster that match the provided predicate
                apiInstance.deleteClusterArtifacts(clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.deleteClusterArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 

try {
    $api_instance->deleteClusterArtifacts($clusterName);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->deleteClusterArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->deleteClusterArtifacts(clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling ClustersApi->deleteClusterArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 

try: 
    # Deletes all artifacts of a cluster that match the provided predicate
    api_instance.deleteClusterArtifacts(clusterName)
except ApiException as e:
    print("Exception when calling ClustersApi->deleteClusterArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteClusterArtifacts_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteClusterArtifacts_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-getCluster">
                      <article id="api-Clusters-getCluster-0" data-group="User" data-name="getCluster" data-version="0">
                        <div class="pull-left">
                          <h1>getCluster</h1>
                          <p>Returns information about a specific cluster</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-getCluster-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-getCluster-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-getCluster-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getCluster-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-getCluster-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-getCluster-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getCluster-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-getCluster-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-getCluster-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-getCluster-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-getCluster-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-getCluster-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-getCluster-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ClusterResponseWrapper result = apiInstance.getCluster(clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-getCluster-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ClusterResponseWrapper result = apiInstance.getCluster(clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-getCluster-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-getCluster-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Clusters/*)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Returns information about a specific cluster
[apiInstance getClusterWith:clusterName
    fields:fields
              completionHandler: ^(ClusterResponseWrapper output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getCluster-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getCluster(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-getCluster-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-getCluster-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getClusterExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Clusters/*)

            try
            {
                // Returns information about a specific cluster
                ClusterResponseWrapper result = apiInstance.getCluster(clusterName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.getCluster: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getCluster-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getCluster($clusterName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->getCluster: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getCluster-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getCluster(clusterName => $clusterName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClustersApi->getCluster: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getCluster-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Clusters/*)

try: 
    # Returns information about a specific cluster
    api_response = api_instance.getCluster(clusterName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClustersApi->getCluster: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getCluster_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getCluster_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Clusters/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getCluster_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getCluster_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getCluster-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getCluster-200-schema">
                                  <div id='responses-getCluster-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ClusterResponseWrapper"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getCluster-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getCluster-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getCluster-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-getClusterArtifact">
                      <article id="api-Clusters-getClusterArtifact-0" data-group="User" data-name="getClusterArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>getClusterArtifact</h1>
                          <p>Get the details of a cluster artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-getClusterArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getClusterArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getClusterArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-getClusterArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/artifacts/{artifactName}?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            ClusterArtifactResponse result = apiInstance.getClusterArtifact(clusterName, artifactName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            ClusterArtifactResponse result = apiInstance.getClusterArtifact(clusterName, artifactName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *artifactName = artifactName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Get the details of a cluster artifact
[apiInstance getClusterArtifactWith:clusterName
    artifactName:artifactName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(ClusterArtifactResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getClusterArtifact(clusterName, artifactName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getClusterArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get the details of a cluster artifact
                ClusterArtifactResponse result = apiInstance.getClusterArtifact(clusterName, artifactName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.getClusterArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$artifactName = artifactName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getClusterArtifact($clusterName, $artifactName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->getClusterArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getClusterArtifact(clusterName => $clusterName, artifactName => $artifactName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClustersApi->getClusterArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
artifactName = artifactName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get the details of a cluster artifact
    api_response = api_instance.getClusterArtifact(clusterName, artifactName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClustersApi->getClusterArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifact_clusterName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifact_artifactName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifact_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifact_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifact_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifact_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifact_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifact_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifact_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifact_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifact_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifact_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getClusterArtifact-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getClusterArtifact-200-schema">
                                  <div id='responses-getClusterArtifact-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ClusterArtifactResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getClusterArtifact-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getClusterArtifact-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getClusterArtifact-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-getClusterArtifacts">
                      <article id="api-Clusters-getClusterArtifacts-0" data-group="User" data-name="getClusterArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>getClusterArtifacts</h1>
                          <p>Returns all artifacts associated with the cluster</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-getClusterArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getClusterArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getClusterArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-getClusterArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/artifacts?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterArtifactResponse] result = apiInstance.getClusterArtifacts(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getClusterArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterArtifactResponse] result = apiInstance.getClusterArtifacts(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getClusterArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Returns all artifacts associated with the cluster
[apiInstance getClusterArtifactsWith:clusterName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ClusterArtifactResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getClusterArtifacts(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getClusterArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns all artifacts associated with the cluster
                array[ClusterArtifactResponse] result = apiInstance.getClusterArtifacts(clusterName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.getClusterArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getClusterArtifacts($clusterName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->getClusterArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getClusterArtifacts(clusterName => $clusterName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClustersApi->getClusterArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns all artifacts associated with the cluster
    api_response = api_instance.getClusterArtifacts(clusterName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClustersApi->getClusterArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifacts_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifacts_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifacts_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifacts_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifacts_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifacts_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifacts_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifacts_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifacts_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifacts_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifacts_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifacts_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getClusterArtifacts-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getClusterArtifacts-200-schema">
                                  <div id='responses-getClusterArtifacts-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ClusterArtifactResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getClusterArtifacts-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getClusterArtifacts-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getClusterArtifacts-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-getClusters">
                      <article id="api-Clusters-getClusters-0" data-group="User" data-name="getClusters" data-version="0">
                        <div class="pull-left">
                          <h1>getClusters</h1>
                          <p>Returns all clusters</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-getClusters-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-getClusters-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-getClusters-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getClusters-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-getClusters-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-getClusters-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getClusters-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-getClusters-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-getClusters-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-getClusters-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-getClusters-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-getClusters-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-getClusters-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterResponseWrapper] result = apiInstance.getClusters(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getClusters");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-getClusters-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterResponseWrapper] result = apiInstance.getClusters(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getClusters");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-getClusters-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-getClusters-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Returns all clusters
[apiInstance getClustersWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ClusterResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusters-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getClusters(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-getClusters-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-getClusters-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getClustersExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns all clusters
                array[ClusterResponseWrapper] result = apiInstance.getClusters(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.getClusters: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusters-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getClusters($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->getClusters: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusters-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getClusters(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClustersApi->getClusters: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusters-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns all clusters
    api_response = api_instance.getClusters(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClustersApi->getClusters: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusters_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusters_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusters_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusters_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusters_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusters_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusters_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusters_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusters_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusters_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getClusters-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getClusters-200-schema">
                                  <div id='responses-getClusters-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ClusterResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getClusters-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getClusters-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getClusters-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-updateCluster">
                      <article id="api-Clusters-updateCluster-0" data-group="User" data-name="updateCluster" data-version="0">
                        <div class="pull-left">
                          <h1>updateCluster</h1>
                          <p>Updates a cluster</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-updateCluster-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-updateCluster-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-updateCluster-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-updateCluster-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-updateCluster-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-updateCluster-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-updateCluster-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-updateCluster-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-updateCluster-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-updateCluster-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-updateCluster-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-updateCluster-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-updateCluster-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        ClusterRequestSwagger body = ; // ClusterRequestSwagger | 
        try {
            apiInstance.updateCluster(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#updateCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-updateCluster-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        ClusterRequestSwagger body = ; // ClusterRequestSwagger | 
        try {
            apiInstance.updateCluster(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#updateCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-updateCluster-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-updateCluster-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
ClusterRequestSwagger *body = ; //  (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Updates a cluster
[apiInstance updateClusterWith:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateCluster-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ClusterRequestSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateCluster(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-updateCluster-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-updateCluster-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateClusterExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var body = new ClusterRequestSwagger(); // ClusterRequestSwagger |  (optional) 

            try
            {
                // Updates a cluster
                apiInstance.updateCluster(clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.updateCluster: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateCluster-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$body = ; // ClusterRequestSwagger | 

try {
    $api_instance->updateCluster($clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->updateCluster: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateCluster-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterRequestSwagger->new(); # ClusterRequestSwagger | 

eval { 
    $api_instance->updateCluster(clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClustersApi->updateCluster: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateCluster-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
body =  # ClusterRequestSwagger |  (optional)

try: 
    # Updates a cluster
    api_instance.updateCluster(clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClustersApi->updateCluster: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateCluster_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateCluster_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateCluster_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateCluster_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-updateClusterArtifact">
                      <article id="api-Clusters-updateClusterArtifact-0" data-group="User" data-name="updateClusterArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>updateClusterArtifact</h1>
                          <p>Updates a single artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-updateClusterArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-updateClusterArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-updateClusterArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-updateClusterArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}/artifacts/{artifactName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        ClusterArtifactRequest body = ; // ClusterArtifactRequest | 
        try {
            apiInstance.updateClusterArtifact(clusterName, artifactName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#updateClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        ClusterArtifactRequest body = ; // ClusterArtifactRequest | 
        try {
            apiInstance.updateClusterArtifact(clusterName, artifactName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#updateClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *artifactName = artifactName_example; // 
ClusterArtifactRequest *body = ; //  (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Updates a single artifact
[apiInstance updateClusterArtifactWith:clusterName
    artifactName:artifactName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var opts = { 
  'body':  // {ClusterArtifactRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateClusterArtifact(clusterName, artifactName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateClusterArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var body = new ClusterArtifactRequest(); // ClusterArtifactRequest |  (optional) 

            try
            {
                // Updates a single artifact
                apiInstance.updateClusterArtifact(clusterName, artifactName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.updateClusterArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$artifactName = artifactName_example; // String | 
$body = ; // ClusterArtifactRequest | 

try {
    $api_instance->updateClusterArtifact($clusterName, $artifactName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->updateClusterArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterArtifactRequest->new(); # ClusterArtifactRequest | 

eval { 
    $api_instance->updateClusterArtifact(clusterName => $clusterName, artifactName => $artifactName, body => $body);
};
if ($@) {
    warn "Exception when calling ClustersApi->updateClusterArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
artifactName = artifactName_example # String | 
body =  # ClusterArtifactRequest |  (optional)

try: 
    # Updates a single artifact
    api_instance.updateClusterArtifact(clusterName, artifactName, body=body)
except ApiException as e:
    print("Exception when calling ClustersApi->updateClusterArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateClusterArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateClusterArtifact_clusterName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateClusterArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateClusterArtifact_artifactName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterArtifactRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateClusterArtifact_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateClusterArtifact_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-updateClusterArtifacts">
                      <article id="api-Clusters-updateClusterArtifacts-0" data-group="User" data-name="updateClusterArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>updateClusterArtifacts</h1>
                          <p>Updates multiple artifacts</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-updateClusterArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-updateClusterArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}/artifacts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        ClusterArtifactRequest body = ; // ClusterArtifactRequest | 
        try {
            apiInstance.updateClusterArtifacts(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#updateClusterArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        ClusterArtifactRequest body = ; // ClusterArtifactRequest | 
        try {
            apiInstance.updateClusterArtifacts(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#updateClusterArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
ClusterArtifactRequest *body = ; //  (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Updates multiple artifacts
[apiInstance updateClusterArtifactsWith:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ClusterArtifactRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateClusterArtifacts(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateClusterArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var body = new ClusterArtifactRequest(); // ClusterArtifactRequest |  (optional) 

            try
            {
                // Updates multiple artifacts
                apiInstance.updateClusterArtifacts(clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.updateClusterArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$body = ; // ClusterArtifactRequest | 

try {
    $api_instance->updateClusterArtifacts($clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->updateClusterArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterArtifactRequest->new(); # ClusterArtifactRequest | 

eval { 
    $api_instance->updateClusterArtifacts(clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClustersApi->updateClusterArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
body =  # ClusterArtifactRequest |  (optional)

try: 
    # Updates multiple artifacts
    api_instance.updateClusterArtifacts(clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClustersApi->updateClusterArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateClusterArtifacts_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateClusterArtifacts_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterArtifactRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateClusterArtifacts_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateClusterArtifacts_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-ConfigGroups">
                  <h1>ConfigGroups</h1>
                    <div id="api-ConfigGroups-createConfigGroup">
                      <article id="api-ConfigGroups-createConfigGroup-0" data-group="User" data-name="createConfigGroup" data-version="0">
                        <div class="pull-left">
                          <h1>createConfigGroup</h1>
                          <p>Creates a config group</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}/config_groups</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ConfigGroups-createConfigGroup-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-java">Java</a></li>
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ConfigGroups-createConfigGroup-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}/config_groups"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigGroupsApi;

import java.io.File;
import java.util.*;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String clusterName = clusterName_example; // String | 
        ConfigGroupRequest body = ; // ConfigGroupRequest | 
        try {
            apiInstance.createConfigGroup(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#createConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigGroupsApi;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String clusterName = clusterName_example; // String | 
        ConfigGroupRequest body = ; // ConfigGroupRequest | 
        try {
            apiInstance.createConfigGroup(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#createConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
ConfigGroupRequest *body = ; //  (optional)

ConfigGroupsApi *apiInstance = [[ConfigGroupsApi alloc] init];

// Creates a config group
[apiInstance createConfigGroupWith:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigGroupsApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ConfigGroupRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createConfigGroup(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createConfigGroupExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigGroupsApi();
            var clusterName = clusterName_example;  // String | 
            var body = new ConfigGroupRequest(); // ConfigGroupRequest |  (optional) 

            try
            {
                // Creates a config group
                apiInstance.createConfigGroup(clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigGroupsApi.createConfigGroup: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigGroupsApi();
$clusterName = clusterName_example; // String | 
$body = ; // ConfigGroupRequest | 

try {
    $api_instance->createConfigGroup($clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ConfigGroupsApi->createConfigGroup: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigGroupsApi;

my $api_instance = WWW::SwaggerClient::ConfigGroupsApi->new();
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ConfigGroupRequest->new(); # ConfigGroupRequest | 

eval { 
    $api_instance->createConfigGroup(clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ConfigGroupsApi->createConfigGroup: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigGroupsApi()
clusterName = clusterName_example # String | 
body =  # ConfigGroupRequest |  (optional)

try: 
    # Creates a config group
    api_instance.createConfigGroup(clusterName, body=body)
except ApiException as e:
    print("Exception when calling ConfigGroupsApi->createConfigGroup: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createConfigGroup_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createConfigGroup_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ConfigGroupRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createConfigGroup_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createConfigGroup_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ConfigGroups-deleteConfigGroup">
                      <article id="api-ConfigGroups-deleteConfigGroup-0" data-group="User" data-name="deleteConfigGroup" data-version="0">
                        <div class="pull-left">
                          <h1>deleteConfigGroup</h1>
                          <p>Deletes a config group</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/config_groups/{groupId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ConfigGroups-deleteConfigGroup-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-java">Java</a></li>
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ConfigGroups-deleteConfigGroup-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/config_groups/{groupId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigGroupsApi;

import java.io.File;
import java.util.*;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String groupId = groupId_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteConfigGroup(groupId, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#deleteConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigGroupsApi;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String groupId = groupId_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteConfigGroup(groupId, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#deleteConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupId = groupId_example; // 
String *clusterName = clusterName_example; // 

ConfigGroupsApi *apiInstance = [[ConfigGroupsApi alloc] init];

// Deletes a config group
[apiInstance deleteConfigGroupWith:groupId
    clusterName:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigGroupsApi()

var groupId = groupId_example; // {String} 

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteConfigGroup(groupId, clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteConfigGroupExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigGroupsApi();
            var groupId = groupId_example;  // String | 
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Deletes a config group
                apiInstance.deleteConfigGroup(groupId, clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigGroupsApi.deleteConfigGroup: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigGroupsApi();
$groupId = groupId_example; // String | 
$clusterName = clusterName_example; // String | 

try {
    $api_instance->deleteConfigGroup($groupId, $clusterName);
} catch (Exception $e) {
    echo 'Exception when calling ConfigGroupsApi->deleteConfigGroup: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigGroupsApi;

my $api_instance = WWW::SwaggerClient::ConfigGroupsApi->new();
my $groupId = groupId_example; # String | 
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->deleteConfigGroup(groupId => $groupId, clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling ConfigGroupsApi->deleteConfigGroup: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigGroupsApi()
groupId = groupId_example # String | 
clusterName = clusterName_example # String | 

try: 
    # Deletes a config group
    api_instance.deleteConfigGroup(groupId, clusterName)
except ApiException as e:
    print("Exception when calling ConfigGroupsApi->deleteConfigGroup: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupId",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteConfigGroup_groupId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteConfigGroup_groupId"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteConfigGroup_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteConfigGroup_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ConfigGroups-getConfigGroup">
                      <article id="api-ConfigGroups-getConfigGroup-0" data-group="User" data-name="getConfigGroup" data-version="0">
                        <div class="pull-left">
                          <h1>getConfigGroup</h1>
                          <p>Returns a single config group</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/config_groups/{groupId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ConfigGroups-getConfigGroup-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-java">Java</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ConfigGroups-getConfigGroup-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/config_groups/{groupId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigGroupsApi;

import java.io.File;
import java.util.*;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String groupId = groupId_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ConfigGroupWrapper result = apiInstance.getConfigGroup(groupId, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#getConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigGroupsApi;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String groupId = groupId_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ConfigGroupWrapper result = apiInstance.getConfigGroup(groupId, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#getConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupId = groupId_example; // 
String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ConfigGroup/*)

ConfigGroupsApi *apiInstance = [[ConfigGroupsApi alloc] init];

// Returns a single config group
[apiInstance getConfigGroupWith:groupId
    clusterName:clusterName
    fields:fields
              completionHandler: ^(ConfigGroupWrapper output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigGroupsApi()

var groupId = groupId_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getConfigGroup(groupId, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getConfigGroupExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigGroupsApi();
            var groupId = groupId_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ConfigGroup/*)

            try
            {
                // Returns a single config group
                ConfigGroupWrapper result = apiInstance.getConfigGroup(groupId, clusterName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigGroupsApi.getConfigGroup: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigGroupsApi();
$groupId = groupId_example; // String | 
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getConfigGroup($groupId, $clusterName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ConfigGroupsApi->getConfigGroup: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigGroupsApi;

my $api_instance = WWW::SwaggerClient::ConfigGroupsApi->new();
my $groupId = groupId_example; # String | 
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getConfigGroup(groupId => $groupId, clusterName => $clusterName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ConfigGroupsApi->getConfigGroup: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigGroupsApi()
groupId = groupId_example # String | 
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ConfigGroup/*)

try: 
    # Returns a single config group
    api_response = api_instance.getConfigGroup(groupId, clusterName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ConfigGroupsApi->getConfigGroup: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupId",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroup_groupId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroup_groupId"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroup_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroup_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ConfigGroup/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroup_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroup_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getConfigGroup-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getConfigGroup-200-schema">
                                  <div id='responses-getConfigGroup-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ConfigGroupWrapper"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getConfigGroup-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getConfigGroup-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getConfigGroup-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ConfigGroups-getConfigGroups">
                      <article id="api-ConfigGroups-getConfigGroups-0" data-group="User" data-name="getConfigGroups" data-version="0">
                        <div class="pull-left">
                          <h1>getConfigGroups</h1>
                          <p>Returns all config groups</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/config_groups</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ConfigGroups-getConfigGroups-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-java">Java</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ConfigGroups-getConfigGroups-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/config_groups?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigGroupsApi;

import java.io.File;
import java.util.*;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ConfigGroupWrapper] result = apiInstance.getConfigGroups(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#getConfigGroups");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigGroupsApi;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ConfigGroupWrapper] result = apiInstance.getConfigGroups(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#getConfigGroups");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ConfigGroup/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ConfigGroupsApi *apiInstance = [[ConfigGroupsApi alloc] init];

// Returns all config groups
[apiInstance getConfigGroupsWith:clusterName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ConfigGroupWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigGroupsApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getConfigGroups(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getConfigGroupsExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigGroupsApi();
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ConfigGroup/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns all config groups
                array[ConfigGroupWrapper] result = apiInstance.getConfigGroups(clusterName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigGroupsApi.getConfigGroups: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigGroupsApi();
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getConfigGroups($clusterName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ConfigGroupsApi->getConfigGroups: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigGroupsApi;

my $api_instance = WWW::SwaggerClient::ConfigGroupsApi->new();
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getConfigGroups(clusterName => $clusterName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ConfigGroupsApi->getConfigGroups: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigGroupsApi()
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ConfigGroup/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns all config groups
    api_response = api_instance.getConfigGroups(clusterName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ConfigGroupsApi->getConfigGroups: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroups_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroups_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ConfigGroup/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroups_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroups_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroups_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroups_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroups_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroups_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroups_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroups_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroups_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroups_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getConfigGroups-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getConfigGroups-200-schema">
                                  <div id='responses-getConfigGroups-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ConfigGroupWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getConfigGroups-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getConfigGroups-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getConfigGroups-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ConfigGroups-updateConfigGroup">
                      <article id="api-ConfigGroups-updateConfigGroup-0" data-group="User" data-name="updateConfigGroup" data-version="0">
                        <div class="pull-left">
                          <h1>updateConfigGroup</h1>
                          <p>Updates a config group</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}/config_groups/{groupId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ConfigGroups-updateConfigGroup-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-java">Java</a></li>
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ConfigGroups-updateConfigGroup-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}/config_groups/{groupId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigGroupsApi;

import java.io.File;
import java.util.*;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String groupId = groupId_example; // String | 
        String clusterName = clusterName_example; // String | 
        ConfigGroupRequest body = ; // ConfigGroupRequest | 
        try {
            apiInstance.updateConfigGroup(groupId, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#updateConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigGroupsApi;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String groupId = groupId_example; // String | 
        String clusterName = clusterName_example; // String | 
        ConfigGroupRequest body = ; // ConfigGroupRequest | 
        try {
            apiInstance.updateConfigGroup(groupId, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#updateConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupId = groupId_example; // 
String *clusterName = clusterName_example; // 
ConfigGroupRequest *body = ; //  (optional)

ConfigGroupsApi *apiInstance = [[ConfigGroupsApi alloc] init];

// Updates a config group
[apiInstance updateConfigGroupWith:groupId
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigGroupsApi()

var groupId = groupId_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ConfigGroupRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateConfigGroup(groupId, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateConfigGroupExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigGroupsApi();
            var groupId = groupId_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ConfigGroupRequest(); // ConfigGroupRequest |  (optional) 

            try
            {
                // Updates a config group
                apiInstance.updateConfigGroup(groupId, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigGroupsApi.updateConfigGroup: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigGroupsApi();
$groupId = groupId_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ConfigGroupRequest | 

try {
    $api_instance->updateConfigGroup($groupId, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ConfigGroupsApi->updateConfigGroup: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigGroupsApi;

my $api_instance = WWW::SwaggerClient::ConfigGroupsApi->new();
my $groupId = groupId_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ConfigGroupRequest->new(); # ConfigGroupRequest | 

eval { 
    $api_instance->updateConfigGroup(groupId => $groupId, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ConfigGroupsApi->updateConfigGroup: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigGroupsApi()
groupId = groupId_example # String | 
clusterName = clusterName_example # String | 
body =  # ConfigGroupRequest |  (optional)

try: 
    # Updates a config group
    api_instance.updateConfigGroup(groupId, clusterName, body=body)
except ApiException as e:
    print("Exception when calling ConfigGroupsApi->updateConfigGroup: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupId",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateConfigGroup_groupId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateConfigGroup_groupId"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateConfigGroup_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateConfigGroup_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ConfigGroupRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateConfigGroup_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateConfigGroup_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Configurations">
                  <h1>Configurations</h1>
                    <div id="api-Configurations-createConfigurations">
                      <article id="api-Configurations-createConfigurations-0" data-group="User" data-name="createConfigurations" data-version="0">
                        <div class="pull-left">
                          <h1>createConfigurations</h1>
                          <p>Create new configurations</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}/configurations</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Configurations-createConfigurations-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-java">Java</a></li>
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Configurations-createConfigurations-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Configurations-createConfigurations-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Configurations-createConfigurations-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}/configurations"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Configurations-createConfigurations-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigurationsApi;

import java.io.File;
import java.util.*;

public class ConfigurationsApiExample {

    public static void main(String[] args) {
        
        ConfigurationsApi apiInstance = new ConfigurationsApi();
        String clusterName = clusterName_example; // String | 
        ConfigurationRequest body = ; // ConfigurationRequest | 
        try {
            apiInstance.createConfigurations(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigurationsApi#createConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Configurations-createConfigurations-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigurationsApi;

public class ConfigurationsApiExample {

    public static void main(String[] args) {
        ConfigurationsApi apiInstance = new ConfigurationsApi();
        String clusterName = clusterName_example; // String | 
        ConfigurationRequest body = ; // ConfigurationRequest | 
        try {
            apiInstance.createConfigurations(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigurationsApi#createConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Configurations-createConfigurations-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Configurations-createConfigurations-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
ConfigurationRequest *body = ; //  (optional)

ConfigurationsApi *apiInstance = [[ConfigurationsApi alloc] init];

// Create new configurations
[apiInstance createConfigurationsWith:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-createConfigurations-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigurationsApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ConfigurationRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createConfigurations(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Configurations-createConfigurations-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Configurations-createConfigurations-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createConfigurationsExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigurationsApi();
            var clusterName = clusterName_example;  // String | 
            var body = new ConfigurationRequest(); // ConfigurationRequest |  (optional) 

            try
            {
                // Create new configurations
                apiInstance.createConfigurations(clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigurationsApi.createConfigurations: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-createConfigurations-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigurationsApi();
$clusterName = clusterName_example; // String | 
$body = ; // ConfigurationRequest | 

try {
    $api_instance->createConfigurations($clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ConfigurationsApi->createConfigurations: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-createConfigurations-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigurationsApi;

my $api_instance = WWW::SwaggerClient::ConfigurationsApi->new();
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ConfigurationRequest->new(); # ConfigurationRequest | 

eval { 
    $api_instance->createConfigurations(clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ConfigurationsApi->createConfigurations: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-createConfigurations-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigurationsApi()
clusterName = clusterName_example # String | 
body =  # ConfigurationRequest |  (optional)

try: 
    # Create new configurations
    api_instance.createConfigurations(clusterName, body=body)
except ApiException as e:
    print("Exception when calling ConfigurationsApi->createConfigurations: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createConfigurations_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createConfigurations_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ConfigurationRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createConfigurations_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createConfigurations_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Configurations-getConfigurations">
                      <article id="api-Configurations-getConfigurations-0" data-group="User" data-name="getConfigurations" data-version="0">
                        <div class="pull-left">
                          <h1>getConfigurations</h1>
                          <p>Get all configurations</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/configurations</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Configurations-getConfigurations-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-java">Java</a></li>
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Configurations-getConfigurations-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Configurations-getConfigurations-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Configurations-getConfigurations-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/configurations?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Configurations-getConfigurations-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigurationsApi;

import java.io.File;
import java.util.*;

public class ConfigurationsApiExample {

    public static void main(String[] args) {
        
        ConfigurationsApi apiInstance = new ConfigurationsApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ConfigurationResponse] result = apiInstance.getConfigurations(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigurationsApi#getConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Configurations-getConfigurations-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigurationsApi;

public class ConfigurationsApiExample {

    public static void main(String[] args) {
        ConfigurationsApi apiInstance = new ConfigurationsApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ConfigurationResponse] result = apiInstance.getConfigurations(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigurationsApi#getConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Configurations-getConfigurations-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Configurations-getConfigurations-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ConfigurationsApi *apiInstance = [[ConfigurationsApi alloc] init];

// Get all configurations
[apiInstance getConfigurationsWith:clusterName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ConfigurationResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getConfigurations-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigurationsApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getConfigurations(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Configurations-getConfigurations-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Configurations-getConfigurations-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getConfigurationsExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigurationsApi();
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all configurations
                array[ConfigurationResponse] result = apiInstance.getConfigurations(clusterName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigurationsApi.getConfigurations: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getConfigurations-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigurationsApi();
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getConfigurations($clusterName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ConfigurationsApi->getConfigurations: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getConfigurations-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigurationsApi;

my $api_instance = WWW::SwaggerClient::ConfigurationsApi->new();
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getConfigurations(clusterName => $clusterName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ConfigurationsApi->getConfigurations: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getConfigurations-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigurationsApi()
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all configurations
    api_response = api_instance.getConfigurations(clusterName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ConfigurationsApi->getConfigurations: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigurations_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigurations_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigurations_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigurations_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigurations_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigurations_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigurations_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigurations_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigurations_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigurations_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigurations_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigurations_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getConfigurations-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getConfigurations-200-schema">
                                  <div id='responses-getConfigurations-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ConfigurationResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getConfigurations-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getConfigurations-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getConfigurations-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Configurations-getServiceConfigVersions">
                      <article id="api-Configurations-getServiceConfigVersions-0" data-group="User" data-name="getServiceConfigVersions" data-version="0">
                        <div class="pull-left">
                          <h1>getServiceConfigVersions</h1>
                          <p>Get all service config versions</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/configurations/service_config_versions</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Configurations-getServiceConfigVersions-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-java">Java</a></li>
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Configurations-getServiceConfigVersions-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/configurations/service_config_versions?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigurationsApi;

import java.io.File;
import java.util.*;

public class ConfigurationsApiExample {

    public static void main(String[] args) {
        
        ConfigurationsApi apiInstance = new ConfigurationsApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ServiceConfigVersionResponse] result = apiInstance.getServiceConfigVersions(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigurationsApi#getServiceConfigVersions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigurationsApi;

public class ConfigurationsApiExample {

    public static void main(String[] args) {
        ConfigurationsApi apiInstance = new ConfigurationsApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ServiceConfigVersionResponse] result = apiInstance.getServiceConfigVersions(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigurationsApi#getServiceConfigVersions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ConfigurationsApi *apiInstance = [[ConfigurationsApi alloc] init];

// Get all service config versions
[apiInstance getServiceConfigVersionsWith:clusterName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ServiceConfigVersionResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigurationsApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getServiceConfigVersions(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getServiceConfigVersionsExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigurationsApi();
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all service config versions
                array[ServiceConfigVersionResponse] result = apiInstance.getServiceConfigVersions(clusterName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigurationsApi.getServiceConfigVersions: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigurationsApi();
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getServiceConfigVersions($clusterName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ConfigurationsApi->getServiceConfigVersions: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigurationsApi;

my $api_instance = WWW::SwaggerClient::ConfigurationsApi->new();
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getServiceConfigVersions(clusterName => $clusterName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ConfigurationsApi->getServiceConfigVersions: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigurationsApi()
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all service config versions
    api_response = api_instance.getServiceConfigVersions(clusterName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ConfigurationsApi->getServiceConfigVersions: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServiceConfigVersions_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServiceConfigVersions_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServiceConfigVersions_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServiceConfigVersions_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServiceConfigVersions_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServiceConfigVersions_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServiceConfigVersions_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServiceConfigVersions_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServiceConfigVersions_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServiceConfigVersions_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServiceConfigVersions_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServiceConfigVersions_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getServiceConfigVersions-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getServiceConfigVersions-200-schema">
                                  <div id='responses-getServiceConfigVersions-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ServiceConfigVersionResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getServiceConfigVersions-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getServiceConfigVersions-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getServiceConfigVersions-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Groups">
                  <h1>Groups</h1>
                    <div id="api-Groups-groupPrivilegeServiceGetPrivilege">
                      <article id="api-Groups-groupPrivilegeServiceGetPrivilege-0" data-group="User" data-name="groupPrivilegeServiceGetPrivilege" data-version="0">
                        <div class="pull-left">
                          <h1>groupPrivilegeServiceGetPrivilege</h1>
                          <p>Get group privilege</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns group privilege details.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/groups/{groupName}/privileges/{privilegeId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/groups/{groupName}/privileges/{privilegeId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String privilegeId = privilegeId_example; // String | privilege id
        String fields = fields_example; // String | Filter group privilege details
        try {
            PrivilegeResponse result = apiInstance.groupPrivilegeServiceGetPrivilege(groupName, privilegeId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupPrivilegeServiceGetPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String privilegeId = privilegeId_example; // String | privilege id
        String fields = fields_example; // String | Filter group privilege details
        try {
            PrivilegeResponse result = apiInstance.groupPrivilegeServiceGetPrivilege(groupName, privilegeId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupPrivilegeServiceGetPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name
String *privilegeId = privilegeId_example; // privilege id
String *fields = fields_example; // Filter group privilege details (optional) (default to PrivilegeInfo/*)

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Get group privilege
[apiInstance groupPrivilegeServiceGetPrivilegeWith:groupName
    privilegeId:privilegeId
    fields:fields
              completionHandler: ^(PrivilegeResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name

var privilegeId = privilegeId_example; // {String} privilege id

var opts = { 
  'fields': fields_example // {String} Filter group privilege details
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.groupPrivilegeServiceGetPrivilege(groupName, privilegeId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class groupPrivilegeServiceGetPrivilegeExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name
            var privilegeId = privilegeId_example;  // String | privilege id
            var fields = fields_example;  // String | Filter group privilege details (optional)  (default to PrivilegeInfo/*)

            try
            {
                // Get group privilege
                PrivilegeResponse result = apiInstance.groupPrivilegeServiceGetPrivilege(groupName, privilegeId, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.groupPrivilegeServiceGetPrivilege: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name
$privilegeId = privilegeId_example; // String | privilege id
$fields = fields_example; // String | Filter group privilege details

try {
    $result = $api_instance->groupPrivilegeServiceGetPrivilege($groupName, $privilegeId, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->groupPrivilegeServiceGetPrivilege: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name
my $privilegeId = privilegeId_example; # String | privilege id
my $fields = fields_example; # String | Filter group privilege details

eval { 
    my $result = $api_instance->groupPrivilegeServiceGetPrivilege(groupName => $groupName, privilegeId => $privilegeId, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling GroupsApi->groupPrivilegeServiceGetPrivilege: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name
privilegeId = privilegeId_example # String | privilege id
fields = fields_example # String | Filter group privilege details (optional) (default to PrivilegeInfo/*)

try: 
    # Get group privilege
    api_response = api_instance.groupPrivilegeServiceGetPrivilege(groupName, privilegeId, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling GroupsApi->groupPrivilegeServiceGetPrivilege: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivilege_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivilege_groupName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">privilegeId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "privilegeId",
  "in" : "path",
  "description" : "privilege id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivilege_privilegeId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivilege_privilegeId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter group privilege details",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivilege_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivilege_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-groupPrivilegeServiceGetPrivilege-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-groupPrivilegeServiceGetPrivilege-200-schema">
                                  <div id='responses-groupPrivilegeServiceGetPrivilege-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/PrivilegeResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-groupPrivilegeServiceGetPrivilege-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-groupPrivilegeServiceGetPrivilege-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-groupPrivilegeServiceGetPrivilege-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-groupPrivilegeServiceGetPrivileges">
                      <article id="api-Groups-groupPrivilegeServiceGetPrivileges-0" data-group="User" data-name="groupPrivilegeServiceGetPrivileges" data-version="0">
                        <div class="pull-left">
                          <h1>groupPrivilegeServiceGetPrivileges</h1>
                          <p>Get all privileges</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all privileges for group.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/groups/{groupName}/privileges</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/groups/{groupName}/privileges?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String fields = fields_example; // String | Filter user privileges
        String sortBy = sortBy_example; // String | Sort user privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[GroupPrivilegeResponse] result = apiInstance.groupPrivilegeServiceGetPrivileges(groupName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupPrivilegeServiceGetPrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String fields = fields_example; // String | Filter user privileges
        String sortBy = sortBy_example; // String | Sort user privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[GroupPrivilegeResponse] result = apiInstance.groupPrivilegeServiceGetPrivileges(groupName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupPrivilegeServiceGetPrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name
String *fields = fields_example; // Filter user privileges (optional) (default to PrivilegeInfo/*)
String *sortBy = sortBy_example; // Sort user privileges (asc | desc) (optional) (default to PrivilegeInfo/user_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive). Valid values are :offset | "end" (optional)

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Get all privileges
[apiInstance groupPrivilegeServiceGetPrivilegesWith:groupName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[GroupPrivilegeResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name

var opts = { 
  'fields': fields_example, // {String} Filter user privileges
  'sortBy': sortBy_example, // {String} Sort user privileges (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive). Valid values are :offset | "start"
  'to': to_example // {String} The ending page resource (inclusive). Valid values are :offset | "end"
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.groupPrivilegeServiceGetPrivileges(groupName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class groupPrivilegeServiceGetPrivilegesExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name
            var fields = fields_example;  // String | Filter user privileges (optional)  (default to PrivilegeInfo/*)
            var sortBy = sortBy_example;  // String | Sort user privileges (asc | desc) (optional)  (default to PrivilegeInfo/user_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive). Valid values are :offset | "start" (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive). Valid values are :offset | "end" (optional) 

            try
            {
                // Get all privileges
                array[GroupPrivilegeResponse] result = apiInstance.groupPrivilegeServiceGetPrivileges(groupName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.groupPrivilegeServiceGetPrivileges: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name
$fields = fields_example; // String | Filter user privileges
$sortBy = sortBy_example; // String | Sort user privileges (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
$to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"

try {
    $result = $api_instance->groupPrivilegeServiceGetPrivileges($groupName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->groupPrivilegeServiceGetPrivileges: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name
my $fields = fields_example; # String | Filter user privileges
my $sortBy = sortBy_example; # String | Sort user privileges (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive). Valid values are :offset | "start"
my $to = to_example; # String | The ending page resource (inclusive). Valid values are :offset | "end"

eval { 
    my $result = $api_instance->groupPrivilegeServiceGetPrivileges(groupName => $groupName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling GroupsApi->groupPrivilegeServiceGetPrivileges: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name
fields = fields_example # String | Filter user privileges (optional) (default to PrivilegeInfo/*)
sortBy = sortBy_example # String | Sort user privileges (asc | desc) (optional) (default to PrivilegeInfo/user_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive). Valid values are :offset | "end" (optional)

try: 
    # Get all privileges
    api_response = api_instance.groupPrivilegeServiceGetPrivileges(groupName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling GroupsApi->groupPrivilegeServiceGetPrivileges: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivileges_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivileges_groupName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter user privileges",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivileges_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivileges_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort user privileges (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/user_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivileges_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivileges_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivileges_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivileges_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive). Valid values are :offset | \"start\"",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivileges_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivileges_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive). Valid values are :offset | \"end\"",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivileges_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivileges_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-groupPrivilegeServiceGetPrivileges-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-groupPrivilegeServiceGetPrivileges-200-schema">
                                  <div id='responses-groupPrivilegeServiceGetPrivileges-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/GroupPrivilegeResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-groupPrivilegeServiceGetPrivileges-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-groupPrivilegeServiceGetPrivileges-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-groupPrivilegeServiceGetPrivileges-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-groupServiceCreateGroup">
                      <article id="api-Groups-groupServiceCreateGroup-0" data-group="User" data-name="groupServiceCreateGroup" data-version="0">
                        <div class="pull-left">
                          <h1>groupServiceCreateGroup</h1>
                          <p>Create new group</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Creates group resource.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/groups</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-groupServiceCreateGroup-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-groupServiceCreateGroup-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/groups"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        GroupRequest body = ; // GroupRequest | input parameters in json form
        try {
            apiInstance.groupServiceCreateGroup(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceCreateGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        GroupRequest body = ; // GroupRequest | input parameters in json form
        try {
            apiInstance.groupServiceCreateGroup(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceCreateGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">GroupRequest *body = ; // input parameters in json form

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Create new group
[apiInstance groupServiceCreateGroupWith:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var body = ; // {GroupRequest} input parameters in json form


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.groupServiceCreateGroup(body, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class groupServiceCreateGroupExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var body = new GroupRequest(); // GroupRequest | input parameters in json form

            try
            {
                // Create new group
                apiInstance.groupServiceCreateGroup(body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.groupServiceCreateGroup: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$body = ; // GroupRequest | input parameters in json form

try {
    $api_instance->groupServiceCreateGroup($body);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->groupServiceCreateGroup: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $body = WWW::SwaggerClient::Object::GroupRequest->new(); # GroupRequest | input parameters in json form

eval { 
    $api_instance->groupServiceCreateGroup(body => $body);
};
if ($@) {
    warn "Exception when calling GroupsApi->groupServiceCreateGroup: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
body =  # GroupRequest | input parameters in json form

try: 
    # Create new group
    api_instance.groupServiceCreateGroup(body)
except ApiException as e:
    print("Exception when calling GroupsApi->groupServiceCreateGroup: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body <span style="color:red;">*</span></td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "description" : "input parameters in json form",
  "required" : true,
  "schema" : {
    "$ref" : "#/definitions/GroupRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_groupServiceCreateGroup_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_groupServiceCreateGroup_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Server Error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-groupServiceDeleteGroup">
                      <article id="api-Groups-groupServiceDeleteGroup-0" data-group="User" data-name="groupServiceDeleteGroup" data-version="0">
                        <div class="pull-left">
                          <h1>groupServiceDeleteGroup</h1>
                          <p>Delete group</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Delete group resource.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/groups/{groupName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-groupServiceDeleteGroup-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-groupServiceDeleteGroup-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/groups/{groupName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        try {
            apiInstance.groupServiceDeleteGroup(groupName);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceDeleteGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        try {
            apiInstance.groupServiceDeleteGroup(groupName);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceDeleteGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Delete group
[apiInstance groupServiceDeleteGroupWith:groupName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.groupServiceDeleteGroup(groupName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class groupServiceDeleteGroupExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name

            try
            {
                // Delete group
                apiInstance.groupServiceDeleteGroup(groupName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.groupServiceDeleteGroup: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name

try {
    $api_instance->groupServiceDeleteGroup($groupName);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->groupServiceDeleteGroup: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name

eval { 
    $api_instance->groupServiceDeleteGroup(groupName => $groupName);
};
if ($@) {
    warn "Exception when calling GroupsApi->groupServiceDeleteGroup: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name

try: 
    # Delete group
    api_instance.groupServiceDeleteGroup(groupName)
except ApiException as e:
    print("Exception when calling GroupsApi->groupServiceDeleteGroup: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceDeleteGroup_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceDeleteGroup_groupName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Server Error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-groupServiceGetGroup">
                      <article id="api-Groups-groupServiceGetGroup-0" data-group="User" data-name="groupServiceGetGroup" data-version="0">
                        <div class="pull-left">
                          <h1>groupServiceGetGroup</h1>
                          <p>Get group</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns group details.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/groups/{groupName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-groupServiceGetGroup-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceGetGroup-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceGetGroup-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-groupServiceGetGroup-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/groups/{groupName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String fields = fields_example; // String | Filter group details
        try {
            GroupResponse result = apiInstance.groupServiceGetGroup(groupName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceGetGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String fields = fields_example; // String | Filter group details
        try {
            GroupResponse result = apiInstance.groupServiceGetGroup(groupName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceGetGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name
String *fields = fields_example; // Filter group details (optional) (default to Groups)

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Get group
[apiInstance groupServiceGetGroupWith:groupName
    fields:fields
              completionHandler: ^(GroupResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name

var opts = { 
  'fields': fields_example // {String} Filter group details
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.groupServiceGetGroup(groupName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class groupServiceGetGroupExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name
            var fields = fields_example;  // String | Filter group details (optional)  (default to Groups)

            try
            {
                // Get group
                GroupResponse result = apiInstance.groupServiceGetGroup(groupName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.groupServiceGetGroup: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name
$fields = fields_example; // String | Filter group details

try {
    $result = $api_instance->groupServiceGetGroup($groupName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->groupServiceGetGroup: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name
my $fields = fields_example; # String | Filter group details

eval { 
    my $result = $api_instance->groupServiceGetGroup(groupName => $groupName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling GroupsApi->groupServiceGetGroup: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name
fields = fields_example # String | Filter group details (optional) (default to Groups)

try: 
    # Get group
    api_response = api_instance.groupServiceGetGroup(groupName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling GroupsApi->groupServiceGetGroup: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceGetGroup_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceGetGroup_groupName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter group details",
  "required" : false,
  "type" : "string",
  "default" : "Groups"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceGetGroup_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceGetGroup_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful retrieval of group resource </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-groupServiceGetGroup-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-groupServiceGetGroup-200-schema">
                                  <div id='responses-groupServiceGetGroup-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful retrieval of group resource",
  "schema" : {
    "$ref" : "#/definitions/GroupResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-groupServiceGetGroup-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-groupServiceGetGroup-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-groupServiceGetGroup-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-groupServiceGetGroups">
                      <article id="api-Groups-groupServiceGetGroups-0" data-group="User" data-name="groupServiceGetGroups" data-version="0">
                        <div class="pull-left">
                          <h1>groupServiceGetGroups</h1>
                          <p>Get all groups</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns details of all groups.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/groups</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-groupServiceGetGroups-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceGetGroups-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceGetGroups-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-groupServiceGetGroups-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/groups?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String fields = fields_example; // String | Filter group details
        String sortBy = sortBy_example; // String | Sort groups (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[GroupResponse] result = apiInstance.groupServiceGetGroups(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceGetGroups");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String fields = fields_example; // String | Filter group details
        String sortBy = sortBy_example; // String | Sort groups (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[GroupResponse] result = apiInstance.groupServiceGetGroups(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceGetGroups");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter group details (optional) (default to Groups/*)
String *sortBy = sortBy_example; // Sort groups (asc | desc) (optional) (default to Groups/group_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive). Valid values are :offset | "end" (optional)

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Get all groups
[apiInstance groupServiceGetGroupsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[GroupResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var opts = { 
  'fields': fields_example, // {String} Filter group details
  'sortBy': sortBy_example, // {String} Sort groups (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive). Valid values are :offset | "start"
  'to': to_example // {String} The ending page resource (inclusive). Valid values are :offset | "end"
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.groupServiceGetGroups(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class groupServiceGetGroupsExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var fields = fields_example;  // String | Filter group details (optional)  (default to Groups/*)
            var sortBy = sortBy_example;  // String | Sort groups (asc | desc) (optional)  (default to Groups/group_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive). Valid values are :offset | "start" (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive). Valid values are :offset | "end" (optional) 

            try
            {
                // Get all groups
                array[GroupResponse] result = apiInstance.groupServiceGetGroups(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.groupServiceGetGroups: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$fields = fields_example; // String | Filter group details
$sortBy = sortBy_example; // String | Sort groups (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
$to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"

try {
    $result = $api_instance->groupServiceGetGroups($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->groupServiceGetGroups: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $fields = fields_example; # String | Filter group details
my $sortBy = sortBy_example; # String | Sort groups (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive). Valid values are :offset | "start"
my $to = to_example; # String | The ending page resource (inclusive). Valid values are :offset | "end"

eval { 
    my $result = $api_instance->groupServiceGetGroups(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling GroupsApi->groupServiceGetGroups: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
fields = fields_example # String | Filter group details (optional) (default to Groups/*)
sortBy = sortBy_example # String | Sort groups (asc | desc) (optional) (default to Groups/group_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive). Valid values are :offset | "end" (optional)

try: 
    # Get all groups
    api_response = api_instance.groupServiceGetGroups(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling GroupsApi->groupServiceGetGroups: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter group details",
  "required" : false,
  "type" : "string",
  "default" : "Groups/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceGetGroups_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceGetGroups_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort groups (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Groups/group_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceGetGroups_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceGetGroups_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceGetGroups_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceGetGroups_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive). Valid values are :offset | \"start\"",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceGetGroups_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceGetGroups_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive). Valid values are :offset | \"end\"",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceGetGroups_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceGetGroups_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful retrieval of all group entries </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-groupServiceGetGroups-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-groupServiceGetGroups-200-schema">
                                  <div id='responses-groupServiceGetGroups-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful retrieval of all group entries",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/GroupResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-groupServiceGetGroups-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-groupServiceGetGroups-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-groupServiceGetGroups-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-memberServiceDeleteMember">
                      <article id="api-Groups-memberServiceDeleteMember-0" data-group="User" data-name="memberServiceDeleteMember" data-version="0">
                        <div class="pull-left">
                          <h1>memberServiceDeleteMember</h1>
                          <p>Delete group member</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Delete member resource.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/groups/{groupName}/members/{userName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-memberServiceDeleteMember-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-memberServiceDeleteMember-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/groups/{groupName}/members/{userName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String userName = userName_example; // String | user name
        try {
            apiInstance.memberServiceDeleteMember(groupName, userName);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceDeleteMember");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String userName = userName_example; // String | user name
        try {
            apiInstance.memberServiceDeleteMember(groupName, userName);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceDeleteMember");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name
String *userName = userName_example; // user name

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Delete group member
[apiInstance memberServiceDeleteMemberWith:groupName
    userName:userName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name

var userName = userName_example; // {String} user name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.memberServiceDeleteMember(groupName, userName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class memberServiceDeleteMemberExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name
            var userName = userName_example;  // String | user name

            try
            {
                // Delete group member
                apiInstance.memberServiceDeleteMember(groupName, userName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.memberServiceDeleteMember: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name
$userName = userName_example; // String | user name

try {
    $api_instance->memberServiceDeleteMember($groupName, $userName);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->memberServiceDeleteMember: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name
my $userName = userName_example; # String | user name

eval { 
    $api_instance->memberServiceDeleteMember(groupName => $groupName, userName => $userName);
};
if ($@) {
    warn "Exception when calling GroupsApi->memberServiceDeleteMember: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name
userName = userName_example # String | user name

try: 
    # Delete group member
    api_instance.memberServiceDeleteMember(groupName, userName)
except ApiException as e:
    print("Exception when calling GroupsApi->memberServiceDeleteMember: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceDeleteMember_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceDeleteMember_groupName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceDeleteMember_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceDeleteMember_userName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Server Error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-memberServiceGetMember">
                      <article id="api-Groups-memberServiceGetMember-0" data-group="User" data-name="memberServiceGetMember" data-version="0">
                        <div class="pull-left">
                          <h1>memberServiceGetMember</h1>
                          <p>Get group member</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns member details.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/groups/{groupName}/members/{userName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-memberServiceGetMember-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceGetMember-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceGetMember-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-memberServiceGetMember-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/groups/{groupName}/members/{userName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter member details
        try {
            MemberResponse result = apiInstance.memberServiceGetMember(groupName, userName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceGetMember");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter member details
        try {
            MemberResponse result = apiInstance.memberServiceGetMember(groupName, userName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceGetMember");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name
String *userName = userName_example; // user name
String *fields = fields_example; // Filter member details (optional) (default to MemberInfo)

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Get group member
[apiInstance memberServiceGetMemberWith:groupName
    userName:userName
    fields:fields
              completionHandler: ^(MemberResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name

var userName = userName_example; // {String} user name

var opts = { 
  'fields': fields_example // {String} Filter member details
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.memberServiceGetMember(groupName, userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class memberServiceGetMemberExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name
            var userName = userName_example;  // String | user name
            var fields = fields_example;  // String | Filter member details (optional)  (default to MemberInfo)

            try
            {
                // Get group member
                MemberResponse result = apiInstance.memberServiceGetMember(groupName, userName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.memberServiceGetMember: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name
$userName = userName_example; // String | user name
$fields = fields_example; // String | Filter member details

try {
    $result = $api_instance->memberServiceGetMember($groupName, $userName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->memberServiceGetMember: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name
my $userName = userName_example; # String | user name
my $fields = fields_example; # String | Filter member details

eval { 
    my $result = $api_instance->memberServiceGetMember(groupName => $groupName, userName => $userName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling GroupsApi->memberServiceGetMember: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name
userName = userName_example # String | user name
fields = fields_example # String | Filter member details (optional) (default to MemberInfo)

try: 
    # Get group member
    api_response = api_instance.memberServiceGetMember(groupName, userName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling GroupsApi->memberServiceGetMember: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMember_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMember_groupName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMember_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMember_userName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter member details",
  "required" : false,
  "type" : "string",
  "default" : "MemberInfo"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMember_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMember_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-memberServiceGetMember-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-memberServiceGetMember-200-schema">
                                  <div id='responses-memberServiceGetMember-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/MemberResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-memberServiceGetMember-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-memberServiceGetMember-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-memberServiceGetMember-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-memberServiceGetMembers">
                      <article id="api-Groups-memberServiceGetMembers-0" data-group="User" data-name="memberServiceGetMembers" data-version="0">
                        <div class="pull-left">
                          <h1>memberServiceGetMembers</h1>
                          <p>Get all group members</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns details of all members.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/groups/{groupName}/members</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-memberServiceGetMembers-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceGetMembers-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceGetMembers-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-memberServiceGetMembers-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/groups/{groupName}/members?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String fields = fields_example; // String | Filter member details
        String sortBy = sortBy_example; // String | Sort members (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[MemberResponse] result = apiInstance.memberServiceGetMembers(groupName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceGetMembers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String fields = fields_example; // String | Filter member details
        String sortBy = sortBy_example; // String | Sort members (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[MemberResponse] result = apiInstance.memberServiceGetMembers(groupName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceGetMembers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name
String *fields = fields_example; // Filter member details (optional) (default to MemberInfo/*)
String *sortBy = sortBy_example; // Sort members (asc | desc) (optional) (default to MemberInfo/user_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive). Valid values are :offset | "end" (optional)

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Get all group members
[apiInstance memberServiceGetMembersWith:groupName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[MemberResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name

var opts = { 
  'fields': fields_example, // {String} Filter member details
  'sortBy': sortBy_example, // {String} Sort members (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive). Valid values are :offset | "start"
  'to': to_example // {String} The ending page resource (inclusive). Valid values are :offset | "end"
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.memberServiceGetMembers(groupName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class memberServiceGetMembersExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name
            var fields = fields_example;  // String | Filter member details (optional)  (default to MemberInfo/*)
            var sortBy = sortBy_example;  // String | Sort members (asc | desc) (optional)  (default to MemberInfo/user_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive). Valid values are :offset | "start" (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive). Valid values are :offset | "end" (optional) 

            try
            {
                // Get all group members
                array[MemberResponse] result = apiInstance.memberServiceGetMembers(groupName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.memberServiceGetMembers: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name
$fields = fields_example; // String | Filter member details
$sortBy = sortBy_example; // String | Sort members (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
$to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"

try {
    $result = $api_instance->memberServiceGetMembers($groupName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->memberServiceGetMembers: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name
my $fields = fields_example; # String | Filter member details
my $sortBy = sortBy_example; # String | Sort members (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive). Valid values are :offset | "start"
my $to = to_example; # String | The ending page resource (inclusive). Valid values are :offset | "end"

eval { 
    my $result = $api_instance->memberServiceGetMembers(groupName => $groupName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling GroupsApi->memberServiceGetMembers: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name
fields = fields_example # String | Filter member details (optional) (default to MemberInfo/*)
sortBy = sortBy_example # String | Sort members (asc | desc) (optional) (default to MemberInfo/user_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive). Valid values are :offset | "end" (optional)

try: 
    # Get all group members
    api_response = api_instance.memberServiceGetMembers(groupName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling GroupsApi->memberServiceGetMembers: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMembers_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMembers_groupName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter member details",
  "required" : false,
  "type" : "string",
  "default" : "MemberInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMembers_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMembers_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort members (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "MemberInfo/user_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMembers_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMembers_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMembers_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMembers_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive). Valid values are :offset | \"start\"",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMembers_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMembers_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive). Valid values are :offset | \"end\"",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMembers_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMembers_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-memberServiceGetMembers-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-memberServiceGetMembers-200-schema">
                                  <div id='responses-memberServiceGetMembers-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/MemberResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-memberServiceGetMembers-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-memberServiceGetMembers-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-memberServiceGetMembers-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-memberServiceUpdateMembers">
                      <article id="api-Groups-memberServiceUpdateMembers-0" data-group="User" data-name="memberServiceUpdateMembers" data-version="0">
                        <div class="pull-left">
                          <h1>memberServiceUpdateMembers</h1>
                          <p>Update group members</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Updates group member resources.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/groups/{groupName}/members</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-memberServiceUpdateMembers-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-memberServiceUpdateMembers-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/groups/{groupName}/members"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        MemberRequest body = ; // MemberRequest | input parameters in json form
        try {
            apiInstance.memberServiceUpdateMembers(groupName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceUpdateMembers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        MemberRequest body = ; // MemberRequest | input parameters in json form
        try {
            apiInstance.memberServiceUpdateMembers(groupName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceUpdateMembers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name
MemberRequest *body = ; // input parameters in json form

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Update group members
[apiInstance memberServiceUpdateMembersWith:groupName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name

var body = ; // {MemberRequest} input parameters in json form


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.memberServiceUpdateMembers(groupName, body, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class memberServiceUpdateMembersExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name
            var body = new MemberRequest(); // MemberRequest | input parameters in json form

            try
            {
                // Update group members
                apiInstance.memberServiceUpdateMembers(groupName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.memberServiceUpdateMembers: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name
$body = ; // MemberRequest | input parameters in json form

try {
    $api_instance->memberServiceUpdateMembers($groupName, $body);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->memberServiceUpdateMembers: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name
my $body = WWW::SwaggerClient::Object::MemberRequest->new(); # MemberRequest | input parameters in json form

eval { 
    $api_instance->memberServiceUpdateMembers(groupName => $groupName, body => $body);
};
if ($@) {
    warn "Exception when calling GroupsApi->memberServiceUpdateMembers: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name
body =  # MemberRequest | input parameters in json form

try: 
    # Update group members
    api_instance.memberServiceUpdateMembers(groupName, body)
except ApiException as e:
    print("Exception when calling GroupsApi->memberServiceUpdateMembers: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceUpdateMembers_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceUpdateMembers_groupName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body <span style="color:red;">*</span></td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "description" : "input parameters in json form",
  "required" : true,
  "schema" : {
    "$ref" : "#/definitions/MemberRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_memberServiceUpdateMembers_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_memberServiceUpdateMembers_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Server Error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-HostComponents">
                  <h1>HostComponents</h1>
                    <div id="api-HostComponents-createHostComponent">
                      <article id="api-HostComponents-createHostComponent-0" data-group="User" data-name="createHostComponent" data-version="0">
                        <div class="pull-left">
                          <h1>createHostComponent</h1>
                          <p>Create new host component</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}/host_components/{hostComponentName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-HostComponents-createHostComponent-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-java">Java</a></li>
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-createHostComponent-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-createHostComponent-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-php">PHP</a></li>
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-HostComponents-createHostComponent-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}/host_components/{hostComponentName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostComponentsApi;

import java.io.File;
import java.util.*;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceComponentHostResponse body = ; // ServiceComponentHostResponse | 
        try {
            apiInstance.createHostComponent(hostComponentName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#createHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostComponentsApi;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceComponentHostResponse body = ; // ServiceComponentHostResponse | 
        try {
            apiInstance.createHostComponent(hostComponentName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#createHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostComponentName = hostComponentName_example; // 
String *clusterName = clusterName_example; // 
ServiceComponentHostResponse *body = ; //  (optional)

HostComponentsApi *apiInstance = [[HostComponentsApi alloc] init];

// Create new host component
[apiInstance createHostComponentWith:hostComponentName
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostComponentsApi()

var hostComponentName = hostComponentName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ServiceComponentHostResponse} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createHostComponent(hostComponentName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-HostComponents-createHostComponent-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createHostComponentExample
    {
        public void main()
        {
            
            var apiInstance = new HostComponentsApi();
            var hostComponentName = hostComponentName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ServiceComponentHostResponse(); // ServiceComponentHostResponse |  (optional) 

            try
            {
                // Create new host component
                apiInstance.createHostComponent(hostComponentName, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostComponentsApi.createHostComponent: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostComponentsApi();
$hostComponentName = hostComponentName_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ServiceComponentHostResponse | 

try {
    $api_instance->createHostComponent($hostComponentName, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling HostComponentsApi->createHostComponent: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostComponentsApi;

my $api_instance = WWW::SwaggerClient::HostComponentsApi->new();
my $hostComponentName = hostComponentName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ServiceComponentHostResponse->new(); # ServiceComponentHostResponse | 

eval { 
    $api_instance->createHostComponent(hostComponentName => $hostComponentName, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling HostComponentsApi->createHostComponent: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostComponentsApi()
hostComponentName = hostComponentName_example # String | 
clusterName = clusterName_example # String | 
body =  # ServiceComponentHostResponse |  (optional)

try: 
    # Create new host component
    api_instance.createHostComponent(hostComponentName, clusterName, body=body)
except ApiException as e:
    print("Exception when calling HostComponentsApi->createHostComponent: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostComponentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostComponentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createHostComponent_hostComponentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createHostComponent_hostComponentName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createHostComponent_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createHostComponent_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ServiceComponentHostResponse"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createHostComponent_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createHostComponent_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-HostComponents-deleteHostComponent">
                      <article id="api-HostComponents-deleteHostComponent-0" data-group="User" data-name="deleteHostComponent" data-version="0">
                        <div class="pull-left">
                          <h1>deleteHostComponent</h1>
                          <p>Delete host component</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/host_components/{hostComponentName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-HostComponents-deleteHostComponent-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-java">Java</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-deleteHostComponent-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-deleteHostComponent-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-php">PHP</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-HostComponents-deleteHostComponent-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/host_components/{hostComponentName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostComponentsApi;

import java.io.File;
import java.util.*;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteHostComponent(hostComponentName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#deleteHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostComponentsApi;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteHostComponent(hostComponentName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#deleteHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostComponentName = hostComponentName_example; // 
String *clusterName = clusterName_example; // 

HostComponentsApi *apiInstance = [[HostComponentsApi alloc] init];

// Delete host component
[apiInstance deleteHostComponentWith:hostComponentName
    clusterName:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostComponentsApi()

var hostComponentName = hostComponentName_example; // {String} 

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteHostComponent(hostComponentName, clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteHostComponentExample
    {
        public void main()
        {
            
            var apiInstance = new HostComponentsApi();
            var hostComponentName = hostComponentName_example;  // String | 
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Delete host component
                apiInstance.deleteHostComponent(hostComponentName, clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostComponentsApi.deleteHostComponent: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostComponentsApi();
$hostComponentName = hostComponentName_example; // String | 
$clusterName = clusterName_example; // String | 

try {
    $api_instance->deleteHostComponent($hostComponentName, $clusterName);
} catch (Exception $e) {
    echo 'Exception when calling HostComponentsApi->deleteHostComponent: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostComponentsApi;

my $api_instance = WWW::SwaggerClient::HostComponentsApi->new();
my $hostComponentName = hostComponentName_example; # String | 
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->deleteHostComponent(hostComponentName => $hostComponentName, clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling HostComponentsApi->deleteHostComponent: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostComponentsApi()
hostComponentName = hostComponentName_example # String | 
clusterName = clusterName_example # String | 

try: 
    # Delete host component
    api_instance.deleteHostComponent(hostComponentName, clusterName)
except ApiException as e:
    print("Exception when calling HostComponentsApi->deleteHostComponent: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostComponentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostComponentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteHostComponent_hostComponentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteHostComponent_hostComponentName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteHostComponent_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteHostComponent_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-HostComponents-deleteHostComponents">
                      <article id="api-HostComponents-deleteHostComponents-0" data-group="User" data-name="deleteHostComponents" data-version="0">
                        <div class="pull-left">
                          <h1>deleteHostComponents</h1>
                          <p>Delete host components</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/host_components</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-HostComponents-deleteHostComponents-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-java">Java</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-deleteHostComponents-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-deleteHostComponents-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-php">PHP</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-HostComponents-deleteHostComponents-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/host_components"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostComponentsApi;

import java.io.File;
import java.util.*;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        
        HostComponentsApi apiInstance = new HostComponentsApi();
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteHostComponents(clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#deleteHostComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostComponentsApi;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        HostComponentsApi apiInstance = new HostComponentsApi();
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteHostComponents(clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#deleteHostComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 

HostComponentsApi *apiInstance = [[HostComponentsApi alloc] init];

// Delete host components
[apiInstance deleteHostComponentsWith:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostComponentsApi()

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteHostComponents(clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteHostComponentsExample
    {
        public void main()
        {
            
            var apiInstance = new HostComponentsApi();
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Delete host components
                apiInstance.deleteHostComponents(clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostComponentsApi.deleteHostComponents: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostComponentsApi();
$clusterName = clusterName_example; // String | 

try {
    $api_instance->deleteHostComponents($clusterName);
} catch (Exception $e) {
    echo 'Exception when calling HostComponentsApi->deleteHostComponents: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostComponentsApi;

my $api_instance = WWW::SwaggerClient::HostComponentsApi->new();
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->deleteHostComponents(clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling HostComponentsApi->deleteHostComponents: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostComponentsApi()
clusterName = clusterName_example # String | 

try: 
    # Delete host components
    api_instance.deleteHostComponents(clusterName)
except ApiException as e:
    print("Exception when calling HostComponentsApi->deleteHostComponents: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteHostComponents_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteHostComponents_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-HostComponents-getHostComponent">
                      <article id="api-HostComponents-getHostComponent-0" data-group="User" data-name="getHostComponent" data-version="0">
                        <div class="pull-left">
                          <h1>getHostComponent</h1>
                          <p>Get single host component for a host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/host_components/{hostComponentName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-HostComponents-getHostComponent-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-java">Java</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-getHostComponent-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-getHostComponent-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-php">PHP</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-HostComponents-getHostComponent-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/host_components/{hostComponentName}?format=&fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostComponentsApi;

import java.io.File;
import java.util.*;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String format = format_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostComponentSwagger result = apiInstance.getHostComponent(hostComponentName, clusterName, format, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#getHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostComponentsApi;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String format = format_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostComponentSwagger result = apiInstance.getHostComponent(hostComponentName, clusterName, format, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#getHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostComponentName = hostComponentName_example; // 
String *clusterName = clusterName_example; // 
String *format = format_example; //  (optional)
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)

HostComponentsApi *apiInstance = [[HostComponentsApi alloc] init];

// Get single host component for a host
[apiInstance getHostComponentWith:hostComponentName
    clusterName:clusterName
    format:format
    fields:fields
              completionHandler: ^(HostComponentSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostComponentsApi()

var hostComponentName = hostComponentName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'format': format_example, // {String} 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getHostComponent(hostComponentName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-HostComponents-getHostComponent-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getHostComponentExample
    {
        public void main()
        {
            
            var apiInstance = new HostComponentsApi();
            var hostComponentName = hostComponentName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var format = format_example;  // String |  (optional) 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 

            try
            {
                // Get single host component for a host
                HostComponentSwagger result = apiInstance.getHostComponent(hostComponentName, clusterName, format, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostComponentsApi.getHostComponent: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostComponentsApi();
$hostComponentName = hostComponentName_example; // String | 
$clusterName = clusterName_example; // String | 
$format = format_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getHostComponent($hostComponentName, $clusterName, $format, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling HostComponentsApi->getHostComponent: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostComponentsApi;

my $api_instance = WWW::SwaggerClient::HostComponentsApi->new();
my $hostComponentName = hostComponentName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $format = format_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getHostComponent(hostComponentName => $hostComponentName, clusterName => $clusterName, format => $format, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling HostComponentsApi->getHostComponent: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostComponentsApi()
hostComponentName = hostComponentName_example # String | 
clusterName = clusterName_example # String | 
format = format_example # String |  (optional)
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)

try: 
    # Get single host component for a host
    api_response = api_instance.getHostComponent(hostComponentName, clusterName, format=format, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling HostComponentsApi->getHostComponent: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostComponentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostComponentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHostComponent_hostComponentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHostComponent_hostComponentName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHostComponent_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHostComponent_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">format</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "format",
  "in" : "query",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHostComponent_format');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHostComponent_format"></div>
</td>
</tr>

                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHostComponent_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHostComponent_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getHostComponent-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getHostComponent-200-schema">
                                  <div id='responses-getHostComponent-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/HostComponentSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getHostComponent-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getHostComponent-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getHostComponent-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-HostComponents-getHostComponents">
                      <article id="api-HostComponents-getHostComponents-0" data-group="User" data-name="getHostComponents" data-version="0">
                        <div class="pull-left">
                          <h1>getHostComponents</h1>
                          <p>Get all host components for a host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/host_components</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-HostComponents-getHostComponents-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-java">Java</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-getHostComponents-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-getHostComponents-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-php">PHP</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-HostComponents-getHostComponents-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/host_components?format=&fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostComponentsApi;

import java.io.File;
import java.util.*;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        
        HostComponentsApi apiInstance = new HostComponentsApi();
        String clusterName = clusterName_example; // String | 
        String format = format_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[HostComponentSwagger] result = apiInstance.getHostComponents(clusterName, format, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#getHostComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostComponentsApi;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        HostComponentsApi apiInstance = new HostComponentsApi();
        String clusterName = clusterName_example; // String | 
        String format = format_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[HostComponentSwagger] result = apiInstance.getHostComponents(clusterName, format, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#getHostComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *format = format_example; //  (optional)
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)

HostComponentsApi *apiInstance = [[HostComponentsApi alloc] init];

// Get all host components for a host
[apiInstance getHostComponentsWith:clusterName
    format:format
    fields:fields
              completionHandler: ^(array[HostComponentSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostComponentsApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'format': format_example, // {String} 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getHostComponents(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-HostComponents-getHostComponents-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getHostComponentsExample
    {
        public void main()
        {
            
            var apiInstance = new HostComponentsApi();
            var clusterName = clusterName_example;  // String | 
            var format = format_example;  // String |  (optional) 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 

            try
            {
                // Get all host components for a host
                array[HostComponentSwagger] result = apiInstance.getHostComponents(clusterName, format, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostComponentsApi.getHostComponents: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostComponentsApi();
$clusterName = clusterName_example; // String | 
$format = format_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getHostComponents($clusterName, $format, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling HostComponentsApi->getHostComponents: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostComponentsApi;

my $api_instance = WWW::SwaggerClient::HostComponentsApi->new();
my $clusterName = clusterName_example; # String | 
my $format = format_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getHostComponents(clusterName => $clusterName, format => $format, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling HostComponentsApi->getHostComponents: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostComponentsApi()
clusterName = clusterName_example # String | 
format = format_example # String |  (optional)
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)

try: 
    # Get all host components for a host
    api_response = api_instance.getHostComponents(clusterName, format=format, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling HostComponentsApi->getHostComponents: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHostComponents_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHostComponents_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">format</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "format",
  "in" : "query",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHostComponents_format');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHostComponents_format"></div>
</td>
</tr>

                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHostComponents_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHostComponents_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getHostComponents-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getHostComponents-200-schema">
                                  <div id='responses-getHostComponents-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/HostComponentSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getHostComponents-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getHostComponents-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getHostComponents-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-HostComponents-getProcesses">
                      <article id="api-HostComponents-getProcesses-0" data-group="User" data-name="getProcesses" data-version="0">
                        <div class="pull-left">
                          <h1>getProcesses</h1>
                          <p>Get processes of a specific host component</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/host_components/{hostComponentName}/processes</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-HostComponents-getProcesses-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-java">Java</a></li>
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-getProcesses-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-getProcesses-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-php">PHP</a></li>
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-HostComponents-getProcesses-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/host_components/{hostComponentName}/processes?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-HostComponents-getProcesses-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostComponentsApi;

import java.io.File;
import java.util.*;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostComponentProcessResponse result = apiInstance.getProcesses(hostComponentName, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#getProcesses");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-HostComponents-getProcesses-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostComponentsApi;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostComponentProcessResponse result = apiInstance.getProcesses(hostComponentName, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#getProcesses");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-HostComponents-getProcesses-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-HostComponents-getProcesses-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostComponentName = hostComponentName_example; // 
String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)

HostComponentsApi *apiInstance = [[HostComponentsApi alloc] init];

// Get processes of a specific host component
[apiInstance getProcessesWith:hostComponentName
    clusterName:clusterName
    fields:fields
              completionHandler: ^(HostComponentProcessResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getProcesses-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostComponentsApi()

var hostComponentName = hostComponentName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getProcesses(hostComponentName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-HostComponents-getProcesses-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-HostComponents-getProcesses-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getProcessesExample
    {
        public void main()
        {
            
            var apiInstance = new HostComponentsApi();
            var hostComponentName = hostComponentName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 

            try
            {
                // Get processes of a specific host component
                HostComponentProcessResponse result = apiInstance.getProcesses(hostComponentName, clusterName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostComponentsApi.getProcesses: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getProcesses-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostComponentsApi();
$hostComponentName = hostComponentName_example; // String | 
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getProcesses($hostComponentName, $clusterName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling HostComponentsApi->getProcesses: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getProcesses-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostComponentsApi;

my $api_instance = WWW::SwaggerClient::HostComponentsApi->new();
my $hostComponentName = hostComponentName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getProcesses(hostComponentName => $hostComponentName, clusterName => $clusterName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling HostComponentsApi->getProcesses: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getProcesses-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostComponentsApi()
hostComponentName = hostComponentName_example # String | 
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)

try: 
    # Get processes of a specific host component
    api_response = api_instance.getProcesses(hostComponentName, clusterName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling HostComponentsApi->getProcesses: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostComponentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostComponentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getProcesses_hostComponentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getProcesses_hostComponentName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getProcesses_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getProcesses_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getProcesses_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getProcesses_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getProcesses-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getProcesses-200-schema">
                                  <div id='responses-getProcesses-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/HostComponentProcessResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getProcesses-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getProcesses-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getProcesses-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-HostComponents-updateHostComponent">
                      <article id="api-HostComponents-updateHostComponent-0" data-group="User" data-name="updateHostComponent" data-version="0">
                        <div class="pull-left">
                          <h1>updateHostComponent</h1>
                          <p>Update host component detail</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}/host_components/{hostComponentName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-HostComponents-updateHostComponent-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-java">Java</a></li>
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-updateHostComponent-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-updateHostComponent-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-php">PHP</a></li>
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-HostComponents-updateHostComponent-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}/host_components/{hostComponentName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostComponentsApi;

import java.io.File;
import java.util.*;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceComponentHostResponse body = ; // ServiceComponentHostResponse | 
        try {
            apiInstance.updateHostComponent(hostComponentName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#updateHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostComponentsApi;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceComponentHostResponse body = ; // ServiceComponentHostResponse | 
        try {
            apiInstance.updateHostComponent(hostComponentName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#updateHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostComponentName = hostComponentName_example; // 
String *clusterName = clusterName_example; // 
ServiceComponentHostResponse *body = ; //  (optional)

HostComponentsApi *apiInstance = [[HostComponentsApi alloc] init];

// Update host component detail
[apiInstance updateHostComponentWith:hostComponentName
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostComponentsApi()

var hostComponentName = hostComponentName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ServiceComponentHostResponse} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateHostComponent(hostComponentName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateHostComponentExample
    {
        public void main()
        {
            
            var apiInstance = new HostComponentsApi();
            var hostComponentName = hostComponentName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ServiceComponentHostResponse(); // ServiceComponentHostResponse |  (optional) 

            try
            {
                // Update host component detail
                apiInstance.updateHostComponent(hostComponentName, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostComponentsApi.updateHostComponent: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostComponentsApi();
$hostComponentName = hostComponentName_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ServiceComponentHostResponse | 

try {
    $api_instance->updateHostComponent($hostComponentName, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling HostComponentsApi->updateHostComponent: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostComponentsApi;

my $api_instance = WWW::SwaggerClient::HostComponentsApi->new();
my $hostComponentName = hostComponentName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ServiceComponentHostResponse->new(); # ServiceComponentHostResponse | 

eval { 
    $api_instance->updateHostComponent(hostComponentName => $hostComponentName, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling HostComponentsApi->updateHostComponent: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostComponentsApi()
hostComponentName = hostComponentName_example # String | 
clusterName = clusterName_example # String | 
body =  # ServiceComponentHostResponse |  (optional)

try: 
    # Update host component detail
    api_instance.updateHostComponent(hostComponentName, clusterName, body=body)
except ApiException as e:
    print("Exception when calling HostComponentsApi->updateHostComponent: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostComponentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostComponentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateHostComponent_hostComponentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateHostComponent_hostComponentName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateHostComponent_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateHostComponent_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ServiceComponentHostResponse"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateHostComponent_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateHostComponent_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Hosts">
                  <h1>Hosts</h1>
                    <div id="api-Hosts-createHost">
                      <article id="api-Hosts-createHost-0" data-group="User" data-name="createHost" data-version="0">
                        <div class="pull-left">
                          <h1>createHost</h1>
                          <p>Creates a host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/hosts/{hostName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-createHost-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-createHost-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-createHost-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-createHost-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-createHost-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-createHost-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-createHost-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-createHost-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-createHost-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-createHost-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-createHost-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-createHost-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/hosts/{hostName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-createHost-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.createHost(hostName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#createHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-createHost-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.createHost(hostName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#createHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-createHost-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-createHost-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostName = hostName_example; // host name
HostRequest *body = ; //  (optional)

HostsApi *apiInstance = [[HostsApi alloc] init];

// Creates a host
[apiInstance createHostWith:hostName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHost-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var hostName = hostName_example; // {String} host name

var opts = { 
  'body':  // {HostRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createHost(hostName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-createHost-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-createHost-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createHostExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var hostName = hostName_example;  // String | host name
            var body = new HostRequest(); // HostRequest |  (optional) 

            try
            {
                // Creates a host
                apiInstance.createHost(hostName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.createHost: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHost-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$hostName = hostName_example; // String | host name
$body = ; // HostRequest | 

try {
    $api_instance->createHost($hostName, $body);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->createHost: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHost-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $hostName = hostName_example; # String | host name
my $body = WWW::SwaggerClient::Object::HostRequest->new(); # HostRequest | 

eval { 
    $api_instance->createHost(hostName => $hostName, body => $body);
};
if ($@) {
    warn "Exception when calling HostsApi->createHost: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHost-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
hostName = hostName_example # String | host name
body =  # HostRequest |  (optional)

try: 
    # Creates a host
    api_instance.createHost(hostName, body=body)
except ApiException as e:
    print("Exception when calling HostsApi->createHost: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostName",
  "in" : "path",
  "description" : "host name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createHost_hostName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createHost_hostName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/HostRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createHost_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createHost_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - Attempt to create a host which already exists </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Hosts-createHosts">
                      <article id="api-Hosts-createHosts-0" data-group="User" data-name="createHosts" data-version="0">
                        <div class="pull-left">
                          <h1>createHosts</h1>
                          <p>Creates multiple hosts in a single request</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/hosts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-createHosts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-createHosts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-createHosts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-createHosts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-createHosts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-createHosts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-createHosts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-createHosts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-createHosts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-createHosts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-createHosts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-createHosts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/hosts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-createHosts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.createHosts(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#createHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-createHosts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.createHosts(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#createHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-createHosts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-createHosts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">HostRequest *body = ; //  (optional)

HostsApi *apiInstance = [[HostsApi alloc] init];

// Creates multiple hosts in a single request
[apiInstance createHostsWith:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHosts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var opts = { 
  'body':  // {HostRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createHosts(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-createHosts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-createHosts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createHostsExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var body = new HostRequest(); // HostRequest |  (optional) 

            try
            {
                // Creates multiple hosts in a single request
                apiInstance.createHosts(body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.createHosts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHosts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$body = ; // HostRequest | 

try {
    $api_instance->createHosts($body);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->createHosts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHosts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $body = WWW::SwaggerClient::Object::HostRequest->new(); # HostRequest | 

eval { 
    $api_instance->createHosts(body => $body);
};
if ($@) {
    warn "Exception when calling HostsApi->createHosts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHosts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
body =  # HostRequest |  (optional)

try: 
    # Creates multiple hosts in a single request
    api_instance.createHosts(body=body)
except ApiException as e:
    print("Exception when calling HostsApi->createHosts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/HostRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createHosts_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createHosts_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Attempt to add hosts that have not been registered </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - Attempt to create a host which already exists </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Hosts-deleteHost">
                      <article id="api-Hosts-deleteHost-0" data-group="User" data-name="deleteHost" data-version="0">
                        <div class="pull-left">
                          <h1>deleteHost</h1>
                          <p>Deletes a host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/hosts/{hostName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-deleteHost-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHost-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHost-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-deleteHost-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-deleteHost-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHost-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-deleteHost-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-deleteHost-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHost-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHost-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHost-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-deleteHost-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/hosts/{hostName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-deleteHost-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        try {
            apiInstance.deleteHost(hostName);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#deleteHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-deleteHost-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        try {
            apiInstance.deleteHost(hostName);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#deleteHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-deleteHost-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-deleteHost-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostName = hostName_example; // host name

HostsApi *apiInstance = [[HostsApi alloc] init];

// Deletes a host
[apiInstance deleteHostWith:hostName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHost-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var hostName = hostName_example; // {String} host name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteHost(hostName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-deleteHost-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-deleteHost-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteHostExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var hostName = hostName_example;  // String | host name

            try
            {
                // Deletes a host
                apiInstance.deleteHost(hostName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.deleteHost: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHost-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$hostName = hostName_example; // String | host name

try {
    $api_instance->deleteHost($hostName);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->deleteHost: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHost-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $hostName = hostName_example; # String | host name

eval { 
    $api_instance->deleteHost(hostName => $hostName);
};
if ($@) {
    warn "Exception when calling HostsApi->deleteHost: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHost-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
hostName = hostName_example # String | host name

try: 
    # Deletes a host
    api_instance.deleteHost(hostName)
except ApiException as e:
    print("Exception when calling HostsApi->deleteHost: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostName",
  "in" : "path",
  "description" : "host name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteHost_hostName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteHost_hostName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Hosts-deleteHosts">
                      <article id="api-Hosts-deleteHosts-0" data-group="User" data-name="deleteHosts" data-version="0">
                        <div class="pull-left">
                          <h1>deleteHosts</h1>
                          <p>Deletes multiple hosts in a single request</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/hosts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-deleteHosts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-deleteHosts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-deleteHosts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-deleteHosts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/hosts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-deleteHosts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.deleteHosts(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#deleteHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-deleteHosts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.deleteHosts(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#deleteHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-deleteHosts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-deleteHosts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">HostRequest *body = ; //  (optional)

HostsApi *apiInstance = [[HostsApi alloc] init];

// Deletes multiple hosts in a single request
[apiInstance deleteHostsWith:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHosts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var opts = { 
  'body':  // {HostRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteHosts(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-deleteHosts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-deleteHosts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteHostsExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var body = new HostRequest(); // HostRequest |  (optional) 

            try
            {
                // Deletes multiple hosts in a single request
                apiInstance.deleteHosts(body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.deleteHosts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHosts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$body = ; // HostRequest | 

try {
    $api_instance->deleteHosts($body);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->deleteHosts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHosts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $body = WWW::SwaggerClient::Object::HostRequest->new(); # HostRequest | 

eval { 
    $api_instance->deleteHosts(body => $body);
};
if ($@) {
    warn "Exception when calling HostsApi->deleteHosts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHosts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
body =  # HostRequest |  (optional)

try: 
    # Deletes multiple hosts in a single request
    api_instance.deleteHosts(body=body)
except ApiException as e:
    print("Exception when calling HostsApi->deleteHosts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/HostRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_deleteHosts_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_deleteHosts_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Hosts-getHost">
                      <article id="api-Hosts-getHost-0" data-group="User" data-name="getHost" data-version="0">
                        <div class="pull-left">
                          <h1>getHost</h1>
                          <p>Returns information about a single host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/hosts/{hostName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-getHost-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-getHost-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-getHost-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-getHost-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-getHost-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-getHost-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-getHost-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-getHost-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-getHost-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-getHost-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-getHost-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-getHost-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/hosts/{hostName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-getHost-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostResponseWrapper result = apiInstance.getHost(hostName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#getHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-getHost-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostResponseWrapper result = apiInstance.getHost(hostName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#getHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-getHost-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-getHost-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostName = hostName_example; // host name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)

HostsApi *apiInstance = [[HostsApi alloc] init];

// Returns information about a single host
[apiInstance getHostWith:hostName
    fields:fields
              completionHandler: ^(HostResponseWrapper output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHost-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var hostName = hostName_example; // {String} host name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getHost(hostName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-getHost-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-getHost-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getHostExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var hostName = hostName_example;  // String | host name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 

            try
            {
                // Returns information about a single host
                HostResponseWrapper result = apiInstance.getHost(hostName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.getHost: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHost-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$hostName = hostName_example; // String | host name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getHost($hostName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->getHost: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHost-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $hostName = hostName_example; # String | host name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getHost(hostName => $hostName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling HostsApi->getHost: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHost-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
hostName = hostName_example # String | host name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)

try: 
    # Returns information about a single host
    api_response = api_instance.getHost(hostName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling HostsApi->getHost: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostName",
  "in" : "path",
  "description" : "host name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHost_hostName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHost_hostName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHost_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHost_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getHost-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getHost-200-schema">
                                  <div id='responses-getHost-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/HostResponseWrapper"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getHost-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getHost-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getHost-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Hosts-getHosts">
                      <article id="api-Hosts-getHosts-0" data-group="User" data-name="getHosts" data-version="0">
                        <div class="pull-left">
                          <h1>getHosts</h1>
                          <p>Returns a collection of all hosts</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/hosts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-getHosts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-getHosts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-getHosts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-getHosts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-getHosts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-getHosts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-getHosts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-getHosts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-getHosts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-getHosts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-getHosts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-getHosts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/hosts?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-getHosts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[HostResponseWrapper] result = apiInstance.getHosts(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#getHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-getHosts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[HostResponseWrapper] result = apiInstance.getHosts(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#getHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-getHosts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-getHosts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Hosts/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Hosts/host_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

HostsApi *apiInstance = [[HostsApi alloc] init];

// Returns a collection of all hosts
[apiInstance getHostsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[HostResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHosts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getHosts(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-getHosts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-getHosts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getHostsExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Hosts/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Hosts/host_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns a collection of all hosts
                array[HostResponseWrapper] result = apiInstance.getHosts(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.getHosts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHosts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getHosts($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->getHosts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHosts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getHosts(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling HostsApi->getHosts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHosts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Hosts/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Hosts/host_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns a collection of all hosts
    api_response = api_instance.getHosts(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling HostsApi->getHosts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Hosts/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHosts_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHosts_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Hosts/host_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHosts_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHosts_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHosts_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHosts_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHosts_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHosts_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHosts_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHosts_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getHosts-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getHosts-200-schema">
                                  <div id='responses-getHosts-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/HostResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getHosts-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getHosts-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getHosts-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Hosts-updateHost">
                      <article id="api-Hosts-updateHost-0" data-group="User" data-name="updateHost" data-version="0">
                        <div class="pull-left">
                          <h1>updateHost</h1>
                          <p>Updates a host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/hosts/{hostName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-updateHost-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-updateHost-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-updateHost-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-updateHost-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-updateHost-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-updateHost-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-updateHost-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-updateHost-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-updateHost-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-updateHost-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-updateHost-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-updateHost-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/hosts/{hostName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-updateHost-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.updateHost(hostName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#updateHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-updateHost-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.updateHost(hostName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#updateHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-updateHost-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-updateHost-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostName = hostName_example; // host name
HostRequest *body = ; //  (optional)

HostsApi *apiInstance = [[HostsApi alloc] init];

// Updates a host
[apiInstance updateHostWith:hostName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHost-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var hostName = hostName_example; // {String} host name

var opts = { 
  'body':  // {HostRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateHost(hostName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-updateHost-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-updateHost-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateHostExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var hostName = hostName_example;  // String | host name
            var body = new HostRequest(); // HostRequest |  (optional) 

            try
            {
                // Updates a host
                apiInstance.updateHost(hostName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.updateHost: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHost-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$hostName = hostName_example; // String | host name
$body = ; // HostRequest | 

try {
    $api_instance->updateHost($hostName, $body);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->updateHost: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHost-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $hostName = hostName_example; # String | host name
my $body = WWW::SwaggerClient::Object::HostRequest->new(); # HostRequest | 

eval { 
    $api_instance->updateHost(hostName => $hostName, body => $body);
};
if ($@) {
    warn "Exception when calling HostsApi->updateHost: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHost-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
hostName = hostName_example # String | host name
body =  # HostRequest |  (optional)

try: 
    # Updates a host
    api_instance.updateHost(hostName, body=body)
except ApiException as e:
    print("Exception when calling HostsApi->updateHost: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostName",
  "in" : "path",
  "description" : "host name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateHost_hostName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateHost_hostName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/HostRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateHost_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateHost_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Hosts-updateHosts">
                      <article id="api-Hosts-updateHosts-0" data-group="User" data-name="updateHosts" data-version="0">
                        <div class="pull-left">
                          <h1>updateHosts</h1>
                          <p>Updates multiple hosts in a single request</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/hosts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-updateHosts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-updateHosts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-updateHosts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-updateHosts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-updateHosts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-updateHosts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-updateHosts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-updateHosts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-updateHosts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-updateHosts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-updateHosts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-updateHosts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/hosts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-updateHosts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.updateHosts(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#updateHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-updateHosts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.updateHosts(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#updateHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-updateHosts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-updateHosts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">HostRequest *body = ; //  (optional)

HostsApi *apiInstance = [[HostsApi alloc] init];

// Updates multiple hosts in a single request
[apiInstance updateHostsWith:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHosts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var opts = { 
  'body':  // {HostRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateHosts(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-updateHosts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-updateHosts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateHostsExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var body = new HostRequest(); // HostRequest |  (optional) 

            try
            {
                // Updates multiple hosts in a single request
                apiInstance.updateHosts(body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.updateHosts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHosts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$body = ; // HostRequest | 

try {
    $api_instance->updateHosts($body);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->updateHosts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHosts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $body = WWW::SwaggerClient::Object::HostRequest->new(); # HostRequest | 

eval { 
    $api_instance->updateHosts(body => $body);
};
if ($@) {
    warn "Exception when calling HostsApi->updateHosts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHosts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
body =  # HostRequest |  (optional)

try: 
    # Updates multiple hosts in a single request
    api_instance.updateHosts(body=body)
except ApiException as e:
    print("Exception when calling HostsApi->updateHosts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/HostRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateHosts_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateHosts_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-RequestSchedules">
                  <h1>RequestSchedules</h1>
                    <div id="api-RequestSchedules-createRequestSchedule">
                      <article id="api-RequestSchedules-createRequestSchedule-0" data-group="User" data-name="createRequestSchedule" data-version="0">
                        <div class="pull-left">
                          <h1>createRequestSchedule</h1>
                          <p>Create new request schedule</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}/request_schedules</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-RequestSchedules-createRequestSchedule-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-java">Java</a></li>
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-php">PHP</a></li>
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-RequestSchedules-createRequestSchedule-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}/request_schedules"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestSchedulesApi;

import java.io.File;
import java.util.*;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String clusterName = clusterName_example; // String | 
        RequestScheduleRequestSwagger body = ; // RequestScheduleRequestSwagger | 
        try {
            apiInstance.createRequestSchedule(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#createRequestSchedule");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestSchedulesApi;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String clusterName = clusterName_example; // String | 
        RequestScheduleRequestSwagger body = ; // RequestScheduleRequestSwagger | 
        try {
            apiInstance.createRequestSchedule(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#createRequestSchedule");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
RequestScheduleRequestSwagger *body = ; //  (optional)

RequestSchedulesApi *apiInstance = [[RequestSchedulesApi alloc] init];

// Create new request schedule
[apiInstance createRequestScheduleWith:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestSchedulesApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {RequestScheduleRequestSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createRequestSchedule(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createRequestScheduleExample
    {
        public void main()
        {
            
            var apiInstance = new RequestSchedulesApi();
            var clusterName = clusterName_example;  // String | 
            var body = new RequestScheduleRequestSwagger(); // RequestScheduleRequestSwagger |  (optional) 

            try
            {
                // Create new request schedule
                apiInstance.createRequestSchedule(clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestSchedulesApi.createRequestSchedule: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestSchedulesApi();
$clusterName = clusterName_example; // String | 
$body = ; // RequestScheduleRequestSwagger | 

try {
    $api_instance->createRequestSchedule($clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling RequestSchedulesApi->createRequestSchedule: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestSchedulesApi;

my $api_instance = WWW::SwaggerClient::RequestSchedulesApi->new();
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::RequestScheduleRequestSwagger->new(); # RequestScheduleRequestSwagger | 

eval { 
    $api_instance->createRequestSchedule(clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling RequestSchedulesApi->createRequestSchedule: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestSchedulesApi()
clusterName = clusterName_example # String | 
body =  # RequestScheduleRequestSwagger |  (optional)

try: 
    # Create new request schedule
    api_instance.createRequestSchedule(clusterName, body=body)
except ApiException as e:
    print("Exception when calling RequestSchedulesApi->createRequestSchedule: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createRequestSchedule_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createRequestSchedule_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/RequestScheduleRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createRequestSchedule_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createRequestSchedule_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-RequestSchedules-deleteRequestSchedule">
                      <article id="api-RequestSchedules-deleteRequestSchedule-0" data-group="User" data-name="deleteRequestSchedule" data-version="0">
                        <div class="pull-left">
                          <h1>deleteRequestSchedule</h1>
                          <p>Delete a request schedule</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Changes status from COMPLETED to DISABLED</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/request_schedules/{requestScheduleId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-RequestSchedules-deleteRequestSchedule-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-java">Java</a></li>
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-php">PHP</a></li>
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-RequestSchedules-deleteRequestSchedule-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/request_schedules/{requestScheduleId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestSchedulesApi;

import java.io.File;
import java.util.*;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String requestScheduleId = requestScheduleId_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteRequestSchedule(requestScheduleId, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#deleteRequestSchedule");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestSchedulesApi;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String requestScheduleId = requestScheduleId_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteRequestSchedule(requestScheduleId, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#deleteRequestSchedule");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *requestScheduleId = requestScheduleId_example; // 
String *clusterName = clusterName_example; // 

RequestSchedulesApi *apiInstance = [[RequestSchedulesApi alloc] init];

// Delete a request schedule
[apiInstance deleteRequestScheduleWith:requestScheduleId
    clusterName:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestSchedulesApi()

var requestScheduleId = requestScheduleId_example; // {String} 

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteRequestSchedule(requestScheduleId, clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteRequestScheduleExample
    {
        public void main()
        {
            
            var apiInstance = new RequestSchedulesApi();
            var requestScheduleId = requestScheduleId_example;  // String | 
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Delete a request schedule
                apiInstance.deleteRequestSchedule(requestScheduleId, clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestSchedulesApi.deleteRequestSchedule: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestSchedulesApi();
$requestScheduleId = requestScheduleId_example; // String | 
$clusterName = clusterName_example; // String | 

try {
    $api_instance->deleteRequestSchedule($requestScheduleId, $clusterName);
} catch (Exception $e) {
    echo 'Exception when calling RequestSchedulesApi->deleteRequestSchedule: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestSchedulesApi;

my $api_instance = WWW::SwaggerClient::RequestSchedulesApi->new();
my $requestScheduleId = requestScheduleId_example; # String | 
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->deleteRequestSchedule(requestScheduleId => $requestScheduleId, clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling RequestSchedulesApi->deleteRequestSchedule: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestSchedulesApi()
requestScheduleId = requestScheduleId_example # String | 
clusterName = clusterName_example # String | 

try: 
    # Delete a request schedule
    api_instance.deleteRequestSchedule(requestScheduleId, clusterName)
except ApiException as e:
    print("Exception when calling RequestSchedulesApi->deleteRequestSchedule: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">requestScheduleId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "requestScheduleId",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteRequestSchedule_requestScheduleId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteRequestSchedule_requestScheduleId"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteRequestSchedule_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteRequestSchedule_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-RequestSchedules-getRequestSchedule">
                      <article id="api-RequestSchedules-getRequestSchedule-0" data-group="User" data-name="getRequestSchedule" data-version="0">
                        <div class="pull-left">
                          <h1>getRequestSchedule</h1>
                          <p>Get request schedule</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/request_schedules/{requestScheduleId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-RequestSchedules-getRequestSchedule-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-java">Java</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-php">PHP</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-RequestSchedules-getRequestSchedule-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/request_schedules/{requestScheduleId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestSchedulesApi;

import java.io.File;
import java.util.*;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String requestScheduleId = requestScheduleId_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RequestScheduleResponseSwagger result = apiInstance.getRequestSchedule(requestScheduleId, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#getRequestSchedule");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestSchedulesApi;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String requestScheduleId = requestScheduleId_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RequestScheduleResponseSwagger result = apiInstance.getRequestSchedule(requestScheduleId, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#getRequestSchedule");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *requestScheduleId = requestScheduleId_example; // 
String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RequestSchedule/*)

RequestSchedulesApi *apiInstance = [[RequestSchedulesApi alloc] init];

// Get request schedule
[apiInstance getRequestScheduleWith:requestScheduleId
    clusterName:clusterName
    fields:fields
              completionHandler: ^(RequestScheduleResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestSchedulesApi()

var requestScheduleId = requestScheduleId_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRequestSchedule(requestScheduleId, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRequestScheduleExample
    {
        public void main()
        {
            
            var apiInstance = new RequestSchedulesApi();
            var requestScheduleId = requestScheduleId_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RequestSchedule/*)

            try
            {
                // Get request schedule
                RequestScheduleResponseSwagger result = apiInstance.getRequestSchedule(requestScheduleId, clusterName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestSchedulesApi.getRequestSchedule: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestSchedulesApi();
$requestScheduleId = requestScheduleId_example; // String | 
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRequestSchedule($requestScheduleId, $clusterName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling RequestSchedulesApi->getRequestSchedule: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestSchedulesApi;

my $api_instance = WWW::SwaggerClient::RequestSchedulesApi->new();
my $requestScheduleId = requestScheduleId_example; # String | 
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRequestSchedule(requestScheduleId => $requestScheduleId, clusterName => $clusterName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling RequestSchedulesApi->getRequestSchedule: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestSchedulesApi()
requestScheduleId = requestScheduleId_example # String | 
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RequestSchedule/*)

try: 
    # Get request schedule
    api_response = api_instance.getRequestSchedule(requestScheduleId, clusterName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling RequestSchedulesApi->getRequestSchedule: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">requestScheduleId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "requestScheduleId",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRequestSchedule_requestScheduleId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRequestSchedule_requestScheduleId"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRequestSchedule_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRequestSchedule_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RequestSchedule/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRequestSchedule_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRequestSchedule_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRequestSchedule-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRequestSchedule-200-schema">
                                  <div id='responses-getRequestSchedule-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/RequestScheduleResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRequestSchedule-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRequestSchedule-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRequestSchedule-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-RequestSchedules-getRequestSchedules">
                      <article id="api-RequestSchedules-getRequestSchedules-0" data-group="User" data-name="getRequestSchedules" data-version="0">
                        <div class="pull-left">
                          <h1>getRequestSchedules</h1>
                          <p>Get all request schedules</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/request_schedules</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-RequestSchedules-getRequestSchedules-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-java">Java</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-php">PHP</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-RequestSchedules-getRequestSchedules-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/request_schedules?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestSchedulesApi;

import java.io.File;
import java.util.*;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RequestScheduleResponseSwagger] result = apiInstance.getRequestSchedules(clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#getRequestSchedules");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestSchedulesApi;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RequestScheduleResponseSwagger] result = apiInstance.getRequestSchedules(clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#getRequestSchedules");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RequestSchedule/*)

RequestSchedulesApi *apiInstance = [[RequestSchedulesApi alloc] init];

// Get all request schedules
[apiInstance getRequestSchedulesWith:clusterName
    fields:fields
              completionHandler: ^(array[RequestScheduleResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestSchedulesApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRequestSchedules(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRequestSchedulesExample
    {
        public void main()
        {
            
            var apiInstance = new RequestSchedulesApi();
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RequestSchedule/*)

            try
            {
                // Get all request schedules
                array[RequestScheduleResponseSwagger] result = apiInstance.getRequestSchedules(clusterName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestSchedulesApi.getRequestSchedules: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestSchedulesApi();
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRequestSchedules($clusterName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling RequestSchedulesApi->getRequestSchedules: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestSchedulesApi;

my $api_instance = WWW::SwaggerClient::RequestSchedulesApi->new();
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRequestSchedules(clusterName => $clusterName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling RequestSchedulesApi->getRequestSchedules: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestSchedulesApi()
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RequestSchedule/*)

try: 
    # Get all request schedules
    api_response = api_instance.getRequestSchedules(clusterName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling RequestSchedulesApi->getRequestSchedules: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRequestSchedules_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRequestSchedules_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RequestSchedule/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRequestSchedules_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRequestSchedules_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRequestSchedules-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRequestSchedules-200-schema">
                                  <div id='responses-getRequestSchedules-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/RequestScheduleResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRequestSchedules-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRequestSchedules-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRequestSchedules-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Requests">
                  <h1>Requests</h1>
                    <div id="api-Requests-requestServiceCreateRequests">
                      <article id="api-Requests-requestServiceCreateRequests-0" data-group="User" data-name="requestServiceCreateRequests" data-version="0">
                        <div class="pull-left">
                          <h1>requestServiceCreateRequests</h1>
                          <p>Creates one or more Requests</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/requests</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Requests-requestServiceCreateRequests-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-java">Java</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Requests-requestServiceCreateRequests-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/requests"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestsApi;

import java.io.File;
import java.util.*;

public class RequestsApiExample {

    public static void main(String[] args) {
        
        RequestsApi apiInstance = new RequestsApi();
        RequestPostRequest body = ; // RequestPostRequest | 
        try {
            apiInstance.requestServiceCreateRequests(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceCreateRequests");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestsApi;

public class RequestsApiExample {

    public static void main(String[] args) {
        RequestsApi apiInstance = new RequestsApi();
        RequestPostRequest body = ; // RequestPostRequest | 
        try {
            apiInstance.requestServiceCreateRequests(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceCreateRequests");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">RequestPostRequest *body = ; //  (optional)

RequestsApi *apiInstance = [[RequestsApi alloc] init];

// Creates one or more Requests
[apiInstance requestServiceCreateRequestsWith:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestsApi()

var opts = { 
  'body':  // {RequestPostRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.requestServiceCreateRequests(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class requestServiceCreateRequestsExample
    {
        public void main()
        {
            
            var apiInstance = new RequestsApi();
            var body = new RequestPostRequest(); // RequestPostRequest |  (optional) 

            try
            {
                // Creates one or more Requests
                apiInstance.requestServiceCreateRequests(body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestsApi.requestServiceCreateRequests: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestsApi();
$body = ; // RequestPostRequest | 

try {
    $api_instance->requestServiceCreateRequests($body);
} catch (Exception $e) {
    echo 'Exception when calling RequestsApi->requestServiceCreateRequests: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestsApi;

my $api_instance = WWW::SwaggerClient::RequestsApi->new();
my $body = WWW::SwaggerClient::Object::RequestPostRequest->new(); # RequestPostRequest | 

eval { 
    $api_instance->requestServiceCreateRequests(body => $body);
};
if ($@) {
    warn "Exception when calling RequestsApi->requestServiceCreateRequests: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestsApi()
body =  # RequestPostRequest |  (optional)

try: 
    # Creates one or more Requests
    api_instance.requestServiceCreateRequests(body=body)
except ApiException as e:
    print("Exception when calling RequestsApi->requestServiceCreateRequests: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/RequestPostRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_requestServiceCreateRequests_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_requestServiceCreateRequests_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-requestServiceCreateRequests-202-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-requestServiceCreateRequests-202-schema">
                                  <div id='responses-requestServiceCreateRequests-202-schema-202' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Request is accepted, but not completely processed yet",
  "schema" : {
    "$ref" : "#/definitions/RequestPostResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-requestServiceCreateRequests-202-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-requestServiceCreateRequests-202-schema-202');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-requestServiceCreateRequests-202-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Requests-requestServiceGetRequest">
                      <article id="api-Requests-requestServiceGetRequest-0" data-group="User" data-name="requestServiceGetRequest" data-version="0">
                        <div class="pull-left">
                          <h1>requestServiceGetRequest</h1>
                          <p>Get the details of a request</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/requests/{requestId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Requests-requestServiceGetRequest-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-java">Java</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceGetRequest-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceGetRequest-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Requests-requestServiceGetRequest-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/requests/{requestId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestsApi;

import java.io.File;
import java.util.*;

public class RequestsApiExample {

    public static void main(String[] args) {
        
        RequestsApi apiInstance = new RequestsApi();
        String requestId = requestId_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RequestResponse result = apiInstance.requestServiceGetRequest(requestId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceGetRequest");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestsApi;

public class RequestsApiExample {

    public static void main(String[] args) {
        RequestsApi apiInstance = new RequestsApi();
        String requestId = requestId_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RequestResponse result = apiInstance.requestServiceGetRequest(requestId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceGetRequest");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *requestId = requestId_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Requests/*)

RequestsApi *apiInstance = [[RequestsApi alloc] init];

// Get the details of a request
[apiInstance requestServiceGetRequestWith:requestId
    fields:fields
              completionHandler: ^(RequestResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestsApi()

var requestId = requestId_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.requestServiceGetRequest(requestId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class requestServiceGetRequestExample
    {
        public void main()
        {
            
            var apiInstance = new RequestsApi();
            var requestId = requestId_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Requests/*)

            try
            {
                // Get the details of a request
                RequestResponse result = apiInstance.requestServiceGetRequest(requestId, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestsApi.requestServiceGetRequest: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestsApi();
$requestId = requestId_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->requestServiceGetRequest($requestId, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling RequestsApi->requestServiceGetRequest: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestsApi;

my $api_instance = WWW::SwaggerClient::RequestsApi->new();
my $requestId = requestId_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->requestServiceGetRequest(requestId => $requestId, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling RequestsApi->requestServiceGetRequest: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestsApi()
requestId = requestId_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Requests/*)

try: 
    # Get the details of a request
    api_response = api_instance.requestServiceGetRequest(requestId, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling RequestsApi->requestServiceGetRequest: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">requestId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "requestId",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceGetRequest_requestId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceGetRequest_requestId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Requests/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceGetRequest_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceGetRequest_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-requestServiceGetRequest-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-requestServiceGetRequest-200-schema">
                                  <div id='responses-requestServiceGetRequest-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/RequestResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-requestServiceGetRequest-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-requestServiceGetRequest-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-requestServiceGetRequest-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Requests-requestServiceGetRequests">
                      <article id="api-Requests-requestServiceGetRequests-0" data-group="User" data-name="requestServiceGetRequests" data-version="0">
                        <div class="pull-left">
                          <h1>requestServiceGetRequests</h1>
                          <p>Get all requests. A predicate can be given to filter results.</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/requests</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Requests-requestServiceGetRequests-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-java">Java</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceGetRequests-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceGetRequests-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Requests-requestServiceGetRequests-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/requests?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestsApi;

import java.io.File;
import java.util.*;

public class RequestsApiExample {

    public static void main(String[] args) {
        
        RequestsApi apiInstance = new RequestsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[RequestResponse] result = apiInstance.requestServiceGetRequests(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceGetRequests");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestsApi;

public class RequestsApiExample {

    public static void main(String[] args) {
        RequestsApi apiInstance = new RequestsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[RequestResponse] result = apiInstance.requestServiceGetRequests(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceGetRequests");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Requests/id)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Requests/id.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

RequestsApi *apiInstance = [[RequestsApi alloc] init];

// Get all requests. A predicate can be given to filter results.
[apiInstance requestServiceGetRequestsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[RequestResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.requestServiceGetRequests(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class requestServiceGetRequestsExample
    {
        public void main()
        {
            
            var apiInstance = new RequestsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Requests/id)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Requests/id.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all requests. A predicate can be given to filter results.
                array[RequestResponse] result = apiInstance.requestServiceGetRequests(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestsApi.requestServiceGetRequests: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->requestServiceGetRequests($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling RequestsApi->requestServiceGetRequests: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestsApi;

my $api_instance = WWW::SwaggerClient::RequestsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->requestServiceGetRequests(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling RequestsApi->requestServiceGetRequests: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Requests/id)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Requests/id.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all requests. A predicate can be given to filter results.
    api_response = api_instance.requestServiceGetRequests(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling RequestsApi->requestServiceGetRequests: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Requests/id"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceGetRequests_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceGetRequests_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Requests/id.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceGetRequests_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceGetRequests_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceGetRequests_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceGetRequests_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceGetRequests_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceGetRequests_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceGetRequests_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceGetRequests_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-requestServiceGetRequests-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-requestServiceGetRequests-200-schema">
                                  <div id='responses-requestServiceGetRequests-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/RequestResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-requestServiceGetRequests-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-requestServiceGetRequests-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-requestServiceGetRequests-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Requests-requestServiceUpdateRequests">
                      <article id="api-Requests-requestServiceUpdateRequests-0" data-group="User" data-name="requestServiceUpdateRequests" data-version="0">
                        <div class="pull-left">
                          <h1>requestServiceUpdateRequests</h1>
                          <p>Updates a request, usually used to cancel running requests.</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Changes the state of an existing request. Usually used to cancel running requests.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/requests/{requestId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Requests-requestServiceUpdateRequests-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-java">Java</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Requests-requestServiceUpdateRequests-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/requests/{requestId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestsApi;

import java.io.File;
import java.util.*;

public class RequestsApiExample {

    public static void main(String[] args) {
        
        RequestsApi apiInstance = new RequestsApi();
        String requestId = requestId_example; // String | 
        RequestPutRequest body = ; // RequestPutRequest | 
        try {
            apiInstance.requestServiceUpdateRequests(requestId, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceUpdateRequests");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestsApi;

public class RequestsApiExample {

    public static void main(String[] args) {
        RequestsApi apiInstance = new RequestsApi();
        String requestId = requestId_example; // String | 
        RequestPutRequest body = ; // RequestPutRequest | 
        try {
            apiInstance.requestServiceUpdateRequests(requestId, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceUpdateRequests");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *requestId = requestId_example; // 
RequestPutRequest *body = ; //  (optional)

RequestsApi *apiInstance = [[RequestsApi alloc] init];

// Updates a request, usually used to cancel running requests.
[apiInstance requestServiceUpdateRequestsWith:requestId
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestsApi()

var requestId = requestId_example; // {String} 

var opts = { 
  'body':  // {RequestPutRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.requestServiceUpdateRequests(requestId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class requestServiceUpdateRequestsExample
    {
        public void main()
        {
            
            var apiInstance = new RequestsApi();
            var requestId = requestId_example;  // String | 
            var body = new RequestPutRequest(); // RequestPutRequest |  (optional) 

            try
            {
                // Updates a request, usually used to cancel running requests.
                apiInstance.requestServiceUpdateRequests(requestId, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestsApi.requestServiceUpdateRequests: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestsApi();
$requestId = requestId_example; // String | 
$body = ; // RequestPutRequest | 

try {
    $api_instance->requestServiceUpdateRequests($requestId, $body);
} catch (Exception $e) {
    echo 'Exception when calling RequestsApi->requestServiceUpdateRequests: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestsApi;

my $api_instance = WWW::SwaggerClient::RequestsApi->new();
my $requestId = requestId_example; # String | 
my $body = WWW::SwaggerClient::Object::RequestPutRequest->new(); # RequestPutRequest | 

eval { 
    $api_instance->requestServiceUpdateRequests(requestId => $requestId, body => $body);
};
if ($@) {
    warn "Exception when calling RequestsApi->requestServiceUpdateRequests: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestsApi()
requestId = requestId_example # String | 
body =  # RequestPutRequest |  (optional)

try: 
    # Updates a request, usually used to cancel running requests.
    api_instance.requestServiceUpdateRequests(requestId, body=body)
except ApiException as e:
    print("Exception when calling RequestsApi->requestServiceUpdateRequests: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">requestId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "requestId",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceUpdateRequests_requestId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceUpdateRequests_requestId"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/RequestPutRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_requestServiceUpdateRequests_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_requestServiceUpdateRequests_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-RootServiceConfigurations">
                  <h1>RootServiceConfigurations</h1>
                    <div id="api-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration">
                      <article id="api-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0" data-group="User" data-name="rootServiceComponentConfigurationServiceDeleteConfiguration" data-version="0">
                        <div class="pull-left">
                          <h1>rootServiceComponentConfigurationServiceDeleteConfiguration</h1>
                          <p>Deletes a root service component configuration resource</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/services/{serviceName}/components/{componentName}/configurations/{category}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-java">Java</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-php">PHP</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/services/{serviceName}/components/{componentName}/configurations/{category}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RootServiceConfigurationsApi;

import java.io.File;
import java.util.*;

public class RootServiceConfigurationsApiExample {

    public static void main(String[] args) {
        
        RootServiceConfigurationsApi apiInstance = new RootServiceConfigurationsApi();
        String category = category_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        try {
            apiInstance.rootServiceComponentConfigurationServiceDeleteConfiguration(category, serviceName, componentName);
        } catch (ApiException e) {
            System.err.println("Exception when calling RootServiceConfigurationsApi#rootServiceComponentConfigurationServiceDeleteConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RootServiceConfigurationsApi;

public class RootServiceConfigurationsApiExample {

    public static void main(String[] args) {
        RootServiceConfigurationsApi apiInstance = new RootServiceConfigurationsApi();
        String category = category_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        try {
            apiInstance.rootServiceComponentConfigurationServiceDeleteConfiguration(category, serviceName, componentName);
        } catch (ApiException e) {
            System.err.println("Exception when calling RootServiceConfigurationsApi#rootServiceComponentConfigurationServiceDeleteConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *category = category_example; // 
String *serviceName = serviceName_example; // 
String *componentName = componentName_example; // 

RootServiceConfigurationsApi *apiInstance = [[RootServiceConfigurationsApi alloc] init];

// Deletes a root service component configuration resource
[apiInstance rootServiceComponentConfigurationServiceDeleteConfigurationWith:category
    serviceName:serviceName
    componentName:componentName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RootServiceConfigurationsApi()

var category = category_example; // {String} 

var serviceName = serviceName_example; // {String} 

var componentName = componentName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.rootServiceComponentConfigurationServiceDeleteConfiguration(category, serviceName, componentName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class rootServiceComponentConfigurationServiceDeleteConfigurationExample
    {
        public void main()
        {
            
            var apiInstance = new RootServiceConfigurationsApi();
            var category = category_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var componentName = componentName_example;  // String | 

            try
            {
                // Deletes a root service component configuration resource
                apiInstance.rootServiceComponentConfigurationServiceDeleteConfiguration(category, serviceName, componentName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RootServiceConfigurationsApi.rootServiceComponentConfigurationServiceDeleteConfiguration: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RootServiceConfigurationsApi();
$category = category_example; // String | 
$serviceName = serviceName_example; // String | 
$componentName = componentName_example; // String | 

try {
    $api_instance->rootServiceComponentConfigurationServiceDeleteConfiguration($category, $serviceName, $componentName);
} catch (Exception $e) {
    echo 'Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceDeleteConfiguration: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RootServiceConfigurationsApi;

my $api_instance = WWW::SwaggerClient::RootServiceConfigurationsApi->new();
my $category = category_example; # String | 
my $serviceName = serviceName_example; # String | 
my $componentName = componentName_example; # String | 

eval { 
    $api_instance->rootServiceComponentConfigurationServiceDeleteConfiguration(category => $category, serviceName => $serviceName, componentName => $componentName);
};
if ($@) {
    warn "Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceDeleteConfiguration: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RootServiceConfigurationsApi()
category = category_example # String | 
serviceName = serviceName_example # String | 
componentName = componentName_example # String | 

try: 
    # Deletes a root service component configuration resource
    api_instance.rootServiceComponentConfigurationServiceDeleteConfiguration(category, serviceName, componentName)
except ApiException as e:
    print("Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceDeleteConfiguration: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">category*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "category",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceDeleteConfiguration_category');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceDeleteConfiguration_category"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceDeleteConfiguration_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceDeleteConfiguration_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceDeleteConfiguration_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceDeleteConfiguration_componentName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration">
                      <article id="api-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0" data-group="User" data-name="rootServiceComponentConfigurationServiceGetConfiguration" data-version="0">
                        <div class="pull-left">
                          <h1>rootServiceComponentConfigurationServiceGetConfiguration</h1>
                          <p>Retrieve the details of a root service component configuration resource</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/components/{componentName}/configurations/{category}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-java">Java</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-php">PHP</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/components/{componentName}/configurations/{category}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RootServiceConfigurationsApi;

import java.io.File;
import java.util.*;

public class RootServiceConfigurationsApiExample {

    public static void main(String[] args) {
        
        RootServiceConfigurationsApi apiInstance = new RootServiceConfigurationsApi();
        String category = category_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceComponentConfigurationResponseSwagger result = apiInstance.rootServiceComponentConfigurationServiceGetConfiguration(category, serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RootServiceConfigurationsApi#rootServiceComponentConfigurationServiceGetConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RootServiceConfigurationsApi;

public class RootServiceConfigurationsApiExample {

    public static void main(String[] args) {
        RootServiceConfigurationsApi apiInstance = new RootServiceConfigurationsApi();
        String category = category_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceComponentConfigurationResponseSwagger result = apiInstance.rootServiceComponentConfigurationServiceGetConfiguration(category, serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RootServiceConfigurationsApi#rootServiceComponentConfigurationServiceGetConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *category = category_example; // 
String *serviceName = serviceName_example; // 
String *componentName = componentName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Configuration/*)

RootServiceConfigurationsApi *apiInstance = [[RootServiceConfigurationsApi alloc] init];

// Retrieve the details of a root service component configuration resource
[apiInstance rootServiceComponentConfigurationServiceGetConfigurationWith:category
    serviceName:serviceName
    componentName:componentName
    fields:fields
              completionHandler: ^(RootServiceComponentConfigurationResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RootServiceConfigurationsApi()

var category = category_example; // {String} 

var serviceName = serviceName_example; // {String} 

var componentName = componentName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.rootServiceComponentConfigurationServiceGetConfiguration(category, serviceName, componentName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class rootServiceComponentConfigurationServiceGetConfigurationExample
    {
        public void main()
        {
            
            var apiInstance = new RootServiceConfigurationsApi();
            var category = category_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var componentName = componentName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Configuration/*)

            try
            {
                // Retrieve the details of a root service component configuration resource
                RootServiceComponentConfigurationResponseSwagger result = apiInstance.rootServiceComponentConfigurationServiceGetConfiguration(category, serviceName, componentName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RootServiceConfigurationsApi.rootServiceComponentConfigurationServiceGetConfiguration: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RootServiceConfigurationsApi();
$category = category_example; // String | 
$serviceName = serviceName_example; // String | 
$componentName = componentName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->rootServiceComponentConfigurationServiceGetConfiguration($category, $serviceName, $componentName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceGetConfiguration: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RootServiceConfigurationsApi;

my $api_instance = WWW::SwaggerClient::RootServiceConfigurationsApi->new();
my $category = category_example; # String | 
my $serviceName = serviceName_example; # String | 
my $componentName = componentName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->rootServiceComponentConfigurationServiceGetConfiguration(category => $category, serviceName => $serviceName, componentName => $componentName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceGetConfiguration: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RootServiceConfigurationsApi()
category = category_example # String | 
serviceName = serviceName_example # String | 
componentName = componentName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Configuration/*)

try: 
    # Retrieve the details of a root service component configuration resource
    api_response = api_instance.rootServiceComponentConfigurationServiceGetConfiguration(category, serviceName, componentName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceGetConfiguration: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">category*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "category",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceGetConfiguration_category');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceGetConfiguration_category"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceGetConfiguration_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceGetConfiguration_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceGetConfiguration_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceGetConfiguration_componentName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Configuration/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceGetConfiguration_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceGetConfiguration_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-rootServiceComponentConfigurationServiceGetConfiguration-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-rootServiceComponentConfigurationServiceGetConfiguration-200-schema">
                                  <div id='responses-rootServiceComponentConfigurationServiceGetConfiguration-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/RootServiceComponentConfigurationResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-rootServiceComponentConfigurationServiceGetConfiguration-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-rootServiceComponentConfigurationServiceGetConfiguration-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-rootServiceComponentConfigurationServiceGetConfiguration-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration">
                      <article id="api-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0" data-group="User" data-name="rootServiceComponentConfigurationServiceUpdateConfiguration" data-version="0">
                        <div class="pull-left">
                          <h1>rootServiceComponentConfigurationServiceUpdateConfiguration</h1>
                          <p>Updates root service component configuration resources </p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/services/{serviceName}/components/{componentName}/configurations/{category}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-java">Java</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-php">PHP</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/services/{serviceName}/components/{componentName}/configurations/{category}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RootServiceConfigurationsApi;

import java.io.File;
import java.util.*;

public class RootServiceConfigurationsApiExample {

    public static void main(String[] args) {
        
        RootServiceConfigurationsApi apiInstance = new RootServiceConfigurationsApi();
        String category = category_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        RootServiceComponentConfigurationRequestSwagger body = ; // RootServiceComponentConfigurationRequestSwagger | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            apiInstance.rootServiceComponentConfigurationServiceUpdateConfiguration(category, serviceName, componentName, body, fields);
        } catch (ApiException e) {
            System.err.println("Exception when calling RootServiceConfigurationsApi#rootServiceComponentConfigurationServiceUpdateConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RootServiceConfigurationsApi;

public class RootServiceConfigurationsApiExample {

    public static void main(String[] args) {
        RootServiceConfigurationsApi apiInstance = new RootServiceConfigurationsApi();
        String category = category_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        RootServiceComponentConfigurationRequestSwagger body = ; // RootServiceComponentConfigurationRequestSwagger | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            apiInstance.rootServiceComponentConfigurationServiceUpdateConfiguration(category, serviceName, componentName, body, fields);
        } catch (ApiException e) {
            System.err.println("Exception when calling RootServiceConfigurationsApi#rootServiceComponentConfigurationServiceUpdateConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *category = category_example; // 
String *serviceName = serviceName_example; // 
String *componentName = componentName_example; // 
RootServiceComponentConfigurationRequestSwagger *body = ; //  (optional)
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Configuration/*)

RootServiceConfigurationsApi *apiInstance = [[RootServiceConfigurationsApi alloc] init];

// Updates root service component configuration resources 
[apiInstance rootServiceComponentConfigurationServiceUpdateConfigurationWith:category
    serviceName:serviceName
    componentName:componentName
    body:body
    fields:fields
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RootServiceConfigurationsApi()

var category = category_example; // {String} 

var serviceName = serviceName_example; // {String} 

var componentName = componentName_example; // {String} 

var opts = { 
  'body': , // {RootServiceComponentConfigurationRequestSwagger} 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.rootServiceComponentConfigurationServiceUpdateConfiguration(category, serviceName, componentName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class rootServiceComponentConfigurationServiceUpdateConfigurationExample
    {
        public void main()
        {
            
            var apiInstance = new RootServiceConfigurationsApi();
            var category = category_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var componentName = componentName_example;  // String | 
            var body = new RootServiceComponentConfigurationRequestSwagger(); // RootServiceComponentConfigurationRequestSwagger |  (optional) 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Configuration/*)

            try
            {
                // Updates root service component configuration resources 
                apiInstance.rootServiceComponentConfigurationServiceUpdateConfiguration(category, serviceName, componentName, body, fields);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RootServiceConfigurationsApi.rootServiceComponentConfigurationServiceUpdateConfiguration: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RootServiceConfigurationsApi();
$category = category_example; // String | 
$serviceName = serviceName_example; // String | 
$componentName = componentName_example; // String | 
$body = ; // RootServiceComponentConfigurationRequestSwagger | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $api_instance->rootServiceComponentConfigurationServiceUpdateConfiguration($category, $serviceName, $componentName, $body, $fields);
} catch (Exception $e) {
    echo 'Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceUpdateConfiguration: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RootServiceConfigurationsApi;

my $api_instance = WWW::SwaggerClient::RootServiceConfigurationsApi->new();
my $category = category_example; # String | 
my $serviceName = serviceName_example; # String | 
my $componentName = componentName_example; # String | 
my $body = WWW::SwaggerClient::Object::RootServiceComponentConfigurationRequestSwagger->new(); # RootServiceComponentConfigurationRequestSwagger | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    $api_instance->rootServiceComponentConfigurationServiceUpdateConfiguration(category => $category, serviceName => $serviceName, componentName => $componentName, body => $body, fields => $fields);
};
if ($@) {
    warn "Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceUpdateConfiguration: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RootServiceConfigurationsApi()
category = category_example # String | 
serviceName = serviceName_example # String | 
componentName = componentName_example # String | 
body =  # RootServiceComponentConfigurationRequestSwagger |  (optional)
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Configuration/*)

try: 
    # Updates root service component configuration resources 
    api_instance.rootServiceComponentConfigurationServiceUpdateConfiguration(category, serviceName, componentName, body=body, fields=fields)
except ApiException as e:
    print("Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceUpdateConfiguration: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">category*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "category",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_category');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_category"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_componentName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/RootServiceComponentConfigurationRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_body"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Configuration/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Services">
                  <h1>Services</h1>
                    <div id="api-Services-getRootHost">
                      <article id="api-Services-getRootHost-0" data-group="User" data-name="getRootHost" data-version="0">
                        <div class="pull-left">
                          <h1>getRootHost</h1>
                          <p>Returns information about the given host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/hosts/{hostName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootHost-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootHost-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootHost-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootHost-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootHost-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootHost-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootHost-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootHost-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootHost-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootHost-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootHost-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootHost-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/hosts/{hostName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootHost-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String hostName = hostName_example; // String | host name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostResponseWrapper result = apiInstance.getRootHost(hostName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootHost-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String hostName = hostName_example; // String | host name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostResponseWrapper result = apiInstance.getRootHost(hostName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootHost-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootHost-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostName = hostName_example; // host name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Hosts/*)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns information about the given host
[apiInstance getRootHostWith:hostName
    fields:fields
              completionHandler: ^(HostResponseWrapper output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHost-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var hostName = hostName_example; // {String} host name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootHost(hostName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootHost-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootHost-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootHostExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var hostName = hostName_example;  // String | host name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Hosts/*)

            try
            {
                // Returns information about the given host
                HostResponseWrapper result = apiInstance.getRootHost(hostName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootHost: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHost-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$hostName = hostName_example; // String | host name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootHost($hostName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootHost: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHost-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $hostName = hostName_example; # String | host name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootHost(hostName => $hostName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootHost: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHost-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
hostName = hostName_example # String | host name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Hosts/*)

try: 
    # Returns information about the given host
    api_response = api_instance.getRootHost(hostName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootHost: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostName",
  "in" : "path",
  "description" : "host name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootHost_hostName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootHost_hostName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Hosts/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootHost_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootHost_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootHost-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootHost-200-schema">
                                  <div id='responses-getRootHost-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/HostResponseWrapper"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootHost-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootHost-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootHost-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootHosts">
                      <article id="api-Services-getRootHosts-0" data-group="User" data-name="getRootHosts" data-version="0">
                        <div class="pull-left">
                          <h1>getRootHosts</h1>
                          <p>Returns the list of hosts for the given root-level service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/hosts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootHosts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootHosts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootHosts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootHosts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootHosts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootHosts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootHosts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootHosts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootHosts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootHosts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootHosts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootHosts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/hosts?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootHosts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[HostResponseWrapper] result = apiInstance.getRootHosts(fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootHosts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[HostResponseWrapper] result = apiInstance.getRootHosts(fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootHosts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootHosts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Hosts/host_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns the list of hosts for the given root-level service
[apiInstance getRootHostsWith:fields
              completionHandler: ^(array[HostResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHosts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootHosts(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootHosts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootHosts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootHostsExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Hosts/host_name)

            try
            {
                // Returns the list of hosts for the given root-level service
                array[HostResponseWrapper] result = apiInstance.getRootHosts(fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootHosts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHosts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootHosts($fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootHosts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHosts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootHosts(fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootHosts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHosts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Hosts/host_name)

try: 
    # Returns the list of hosts for the given root-level service
    api_response = api_instance.getRootHosts(fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootHosts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Hosts/host_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootHosts_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootHosts_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootHosts-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootHosts-200-schema">
                                  <div id='responses-getRootHosts-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/HostResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootHosts-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootHosts-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootHosts-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootService">
                      <article id="api-Services-getRootService-0" data-group="User" data-name="getRootService" data-version="0">
                        <div class="pull-left">
                          <h1>getRootService</h1>
                          <p>Returns information about the given root-level service, including a list of its components</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootService-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceResponseWithComponentList result = apiInstance.getRootService(serviceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceResponseWithComponentList result = apiInstance.getRootService(serviceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // service name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RootService/service_name, components/RootServiceComponents/component_name, components/RootServiceComponents/service_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns information about the given root-level service, including a list of its components
[apiInstance getRootServiceWith:serviceName
    fields:fields
              completionHandler: ^(RootServiceResponseWithComponentList output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var serviceName = serviceName_example; // {String} service name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootService(serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var serviceName = serviceName_example;  // String | service name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RootService/service_name, components/RootServiceComponents/component_name, components/RootServiceComponents/service_name)

            try
            {
                // Returns information about the given root-level service, including a list of its components
                RootServiceResponseWithComponentList result = apiInstance.getRootService(serviceName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$serviceName = serviceName_example; // String | service name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootService($serviceName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $serviceName = serviceName_example; # String | service name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootService(serviceName => $serviceName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
serviceName = serviceName_example # String | service name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RootService/service_name, components/RootServiceComponents/component_name, components/RootServiceComponents/service_name)

try: 
    # Returns information about the given root-level service, including a list of its components
    api_response = api_instance.getRootService(serviceName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "description" : "service name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootService_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootService_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RootService/service_name, components/RootServiceComponents/component_name, components/RootServiceComponents/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootService_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootService_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootService-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootService-200-schema">
                                  <div id='responses-getRootService-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/RootServiceResponseWithComponentList"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootService-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootService-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootService-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootServiceComponent">
                      <article id="api-Services-getRootServiceComponent-0" data-group="User" data-name="getRootServiceComponent" data-version="0">
                        <div class="pull-left">
                          <h1>getRootServiceComponent</h1>
                          <p>Returns information about the given component for the given root-level service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/components/{componentName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootServiceComponent-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceComponent-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceComponent-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootServiceComponent-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/components/{componentName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String componentName = componentName_example; // String | component name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceComponentWithHostComponentList result = apiInstance.getRootServiceComponent(serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String componentName = componentName_example; // String | component name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceComponentWithHostComponentList result = apiInstance.getRootServiceComponent(serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // service name
String *componentName = componentName_example; // component name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceComponents/*, hostComponents/RootServiceHostComponents/component_name, hostComponents/RootServiceHostComponents/host_name, hostComponents/RootServiceHostComponents/service_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns information about the given component for the given root-level service
[apiInstance getRootServiceComponentWith:serviceName
    componentName:componentName
    fields:fields
              completionHandler: ^(RootServiceComponentWithHostComponentList output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var serviceName = serviceName_example; // {String} service name

var componentName = componentName_example; // {String} component name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootServiceComponent(serviceName, componentName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootServiceComponent-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootServiceComponentExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var serviceName = serviceName_example;  // String | service name
            var componentName = componentName_example;  // String | component name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RootServiceComponents/*, hostComponents/RootServiceHostComponents/component_name, hostComponents/RootServiceHostComponents/host_name, hostComponents/RootServiceHostComponents/service_name)

            try
            {
                // Returns information about the given component for the given root-level service
                RootServiceComponentWithHostComponentList result = apiInstance.getRootServiceComponent(serviceName, componentName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootServiceComponent: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$serviceName = serviceName_example; // String | service name
$componentName = componentName_example; // String | component name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootServiceComponent($serviceName, $componentName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootServiceComponent: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $serviceName = serviceName_example; # String | service name
my $componentName = componentName_example; # String | component name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootServiceComponent(serviceName => $serviceName, componentName => $componentName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootServiceComponent: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
serviceName = serviceName_example # String | service name
componentName = componentName_example # String | component name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceComponents/*, hostComponents/RootServiceHostComponents/component_name, hostComponents/RootServiceHostComponents/host_name, hostComponents/RootServiceHostComponents/service_name)

try: 
    # Returns information about the given component for the given root-level service
    api_response = api_instance.getRootServiceComponent(serviceName, componentName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootServiceComponent: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "description" : "service name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponent_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponent_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "description" : "component name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponent_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponent_componentName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RootServiceComponents/*, hostComponents/RootServiceHostComponents/component_name, hostComponents/RootServiceHostComponents/host_name, hostComponents/RootServiceHostComponents/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponent_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponent_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootServiceComponent-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootServiceComponent-200-schema">
                                  <div id='responses-getRootServiceComponent-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/RootServiceComponentWithHostComponentList"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootServiceComponent-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootServiceComponent-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootServiceComponent-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootServiceComponentHosts">
                      <article id="api-Services-getRootServiceComponentHosts-0" data-group="User" data-name="getRootServiceComponentHosts" data-version="0">
                        <div class="pull-left">
                          <h1>getRootServiceComponentHosts</h1>
                          <p>Returns the list of hosts for the given root-level service component</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/components/{componentName}/hostComponents</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootServiceComponentHosts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootServiceComponentHosts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/components/{componentName}/hostComponents?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String componentName = componentName_example; // String | component name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceHostComponentResponseWrapper] result = apiInstance.getRootServiceComponentHosts(serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceComponentHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String componentName = componentName_example; // String | component name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceHostComponentResponseWrapper] result = apiInstance.getRootServiceComponentHosts(serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceComponentHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // service name
String *componentName = componentName_example; // component name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns the list of hosts for the given root-level service component
[apiInstance getRootServiceComponentHostsWith:serviceName
    componentName:componentName
    fields:fields
              completionHandler: ^(array[RootServiceHostComponentResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var serviceName = serviceName_example; // {String} service name

var componentName = componentName_example; // {String} component name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootServiceComponentHosts(serviceName, componentName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootServiceComponentHostsExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var serviceName = serviceName_example;  // String | service name
            var componentName = componentName_example;  // String | component name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

            try
            {
                // Returns the list of hosts for the given root-level service component
                array[RootServiceHostComponentResponseWrapper] result = apiInstance.getRootServiceComponentHosts(serviceName, componentName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootServiceComponentHosts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$serviceName = serviceName_example; // String | service name
$componentName = componentName_example; // String | component name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootServiceComponentHosts($serviceName, $componentName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootServiceComponentHosts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $serviceName = serviceName_example; # String | service name
my $componentName = componentName_example; # String | component name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootServiceComponentHosts(serviceName => $serviceName, componentName => $componentName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootServiceComponentHosts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
serviceName = serviceName_example # String | service name
componentName = componentName_example # String | component name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

try: 
    # Returns the list of hosts for the given root-level service component
    api_response = api_instance.getRootServiceComponentHosts(serviceName, componentName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootServiceComponentHosts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "description" : "service name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponentHosts_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponentHosts_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "description" : "component name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponentHosts_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponentHosts_componentName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponentHosts_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponentHosts_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootServiceComponentHosts-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootServiceComponentHosts-200-schema">
                                  <div id='responses-getRootServiceComponentHosts-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/RootServiceHostComponentResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootServiceComponentHosts-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootServiceComponentHosts-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootServiceComponentHosts-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootServiceComponents">
                      <article id="api-Services-getRootServiceComponents-0" data-group="User" data-name="getRootServiceComponents" data-version="0">
                        <div class="pull-left">
                          <h1>getRootServiceComponents</h1>
                          <p>Returns the list of components for the given root-level service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/components</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootServiceComponents-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceComponents-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceComponents-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootServiceComponents-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/components?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceComponentResponseWrapper] result = apiInstance.getRootServiceComponents(serviceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceComponentResponseWrapper] result = apiInstance.getRootServiceComponents(serviceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // service name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceComponents/component_name, RootServiceComponents/service_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns the list of components for the given root-level service
[apiInstance getRootServiceComponentsWith:serviceName
    fields:fields
              completionHandler: ^(array[RootServiceComponentResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var serviceName = serviceName_example; // {String} service name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootServiceComponents(serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootServiceComponents-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootServiceComponentsExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var serviceName = serviceName_example;  // String | service name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RootServiceComponents/component_name, RootServiceComponents/service_name)

            try
            {
                // Returns the list of components for the given root-level service
                array[RootServiceComponentResponseWrapper] result = apiInstance.getRootServiceComponents(serviceName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootServiceComponents: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$serviceName = serviceName_example; // String | service name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootServiceComponents($serviceName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootServiceComponents: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $serviceName = serviceName_example; # String | service name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootServiceComponents(serviceName => $serviceName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootServiceComponents: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
serviceName = serviceName_example # String | service name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceComponents/component_name, RootServiceComponents/service_name)

try: 
    # Returns the list of components for the given root-level service
    api_response = api_instance.getRootServiceComponents(serviceName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootServiceComponents: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "description" : "service name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponents_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponents_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RootServiceComponents/component_name, RootServiceComponents/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponents_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponents_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootServiceComponents-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootServiceComponents-200-schema">
                                  <div id='responses-getRootServiceComponents-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/RootServiceComponentResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootServiceComponents-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootServiceComponents-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootServiceComponents-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootServiceHostComponent">
                      <article id="api-Services-getRootServiceHostComponent-0" data-group="User" data-name="getRootServiceHostComponent" data-version="0">
                        <div class="pull-left">
                          <h1>getRootServiceHostComponent</h1>
                          <p>Returns information about the given component for the given root-level service on the given host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/hosts/{hostName}/hostComponents/{hostComponent}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootServiceHostComponent-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceHostComponent-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceHostComponent-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootServiceHostComponent-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/hosts/{hostName}/hostComponents/{hostComponent}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String hostName = hostName_example; // String | host name
        String hostComponent = hostComponent_example; // String | component name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceHostComponentResponseWrapper result = apiInstance.getRootServiceHostComponent(serviceName, hostName, hostComponent, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String hostName = hostName_example; // String | host name
        String hostComponent = hostComponent_example; // String | component name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceHostComponentResponseWrapper result = apiInstance.getRootServiceHostComponent(serviceName, hostName, hostComponent, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // service name
String *hostName = hostName_example; // host name
String *hostComponent = hostComponent_example; // component name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns information about the given component for the given root-level service on the given host
[apiInstance getRootServiceHostComponentWith:serviceName
    hostName:hostName
    hostComponent:hostComponent
    fields:fields
              completionHandler: ^(RootServiceHostComponentResponseWrapper output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var serviceName = serviceName_example; // {String} service name

var hostName = hostName_example; // {String} host name

var hostComponent = hostComponent_example; // {String} component name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootServiceHostComponent(serviceName, hostName, hostComponent, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootServiceHostComponentExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var serviceName = serviceName_example;  // String | service name
            var hostName = hostName_example;  // String | host name
            var hostComponent = hostComponent_example;  // String | component name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

            try
            {
                // Returns information about the given component for the given root-level service on the given host
                RootServiceHostComponentResponseWrapper result = apiInstance.getRootServiceHostComponent(serviceName, hostName, hostComponent, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootServiceHostComponent: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$serviceName = serviceName_example; // String | service name
$hostName = hostName_example; // String | host name
$hostComponent = hostComponent_example; // String | component name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootServiceHostComponent($serviceName, $hostName, $hostComponent, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootServiceHostComponent: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $serviceName = serviceName_example; # String | service name
my $hostName = hostName_example; # String | host name
my $hostComponent = hostComponent_example; # String | component name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootServiceHostComponent(serviceName => $serviceName, hostName => $hostName, hostComponent => $hostComponent, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootServiceHostComponent: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
serviceName = serviceName_example # String | service name
hostName = hostName_example # String | host name
hostComponent = hostComponent_example # String | component name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

try: 
    # Returns information about the given component for the given root-level service on the given host
    api_response = api_instance.getRootServiceHostComponent(serviceName, hostName, hostComponent, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootServiceHostComponent: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "description" : "service name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceHostComponent_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceHostComponent_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">hostName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostName",
  "in" : "path",
  "description" : "host name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceHostComponent_hostName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceHostComponent_hostName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">hostComponent*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostComponent",
  "in" : "path",
  "description" : "component name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceHostComponent_hostComponent');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceHostComponent_hostComponent"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceHostComponent_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceHostComponent_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootServiceHostComponent-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootServiceHostComponent-200-schema">
                                  <div id='responses-getRootServiceHostComponent-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/RootServiceHostComponentResponseWrapper"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootServiceHostComponent-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootServiceHostComponent-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootServiceHostComponent-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootServiceHostComponents">
                      <article id="api-Services-getRootServiceHostComponents-0" data-group="User" data-name="getRootServiceHostComponents" data-version="0">
                        <div class="pull-left">
                          <h1>getRootServiceHostComponents</h1>
                          <p>Returns the list of components for the given root-level service on the given host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/hosts/{hostName}/hostComponents</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootServiceHostComponents-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceHostComponents-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceHostComponents-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootServiceHostComponents-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/hosts/{hostName}/hostComponents?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String hostName = hostName_example; // String | host name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceHostComponentResponseWrapper] result = apiInstance.getRootServiceHostComponents(serviceName, hostName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceHostComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String hostName = hostName_example; // String | host name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceHostComponentResponseWrapper] result = apiInstance.getRootServiceHostComponents(serviceName, hostName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceHostComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // service name
String *hostName = hostName_example; // host name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns the list of components for the given root-level service on the given host
[apiInstance getRootServiceHostComponentsWith:serviceName
    hostName:hostName
    fields:fields
              completionHandler: ^(array[RootServiceHostComponentResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var serviceName = serviceName_example; // {String} service name

var hostName = hostName_example; // {String} host name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootServiceHostComponents(serviceName, hostName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootServiceHostComponentsExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var serviceName = serviceName_example;  // String | service name
            var hostName = hostName_example;  // String | host name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

            try
            {
                // Returns the list of components for the given root-level service on the given host
                array[RootServiceHostComponentResponseWrapper] result = apiInstance.getRootServiceHostComponents(serviceName, hostName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootServiceHostComponents: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$serviceName = serviceName_example; // String | service name
$hostName = hostName_example; // String | host name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootServiceHostComponents($serviceName, $hostName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootServiceHostComponents: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $serviceName = serviceName_example; # String | service name
my $hostName = hostName_example; # String | host name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootServiceHostComponents(serviceName => $serviceName, hostName => $hostName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootServiceHostComponents: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
serviceName = serviceName_example # String | service name
hostName = hostName_example # String | host name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

try: 
    # Returns the list of components for the given root-level service on the given host
    api_response = api_instance.getRootServiceHostComponents(serviceName, hostName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootServiceHostComponents: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "description" : "service name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceHostComponents_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceHostComponents_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">hostName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostName",
  "in" : "path",
  "description" : "host name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceHostComponents_hostName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceHostComponents_hostName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceHostComponents_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceHostComponents_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootServiceHostComponents-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootServiceHostComponents-200-schema">
                                  <div id='responses-getRootServiceHostComponents-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/RootServiceHostComponentResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootServiceHostComponents-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootServiceHostComponents-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootServiceHostComponents-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootServices">
                      <article id="api-Services-getRootServices-0" data-group="User" data-name="getRootServices" data-version="0">
                        <div class="pull-left">
                          <h1>getRootServices</h1>
                          <p>Returns the list of root-level services</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceResponseWrapper] result = apiInstance.getRootServices(fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceResponseWrapper] result = apiInstance.getRootServices(fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RootService/service_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns the list of root-level services
[apiInstance getRootServicesWith:fields
              completionHandler: ^(array[RootServiceResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootServices(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootServicesExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RootService/service_name)

            try
            {
                // Returns the list of root-level services
                array[RootServiceResponseWrapper] result = apiInstance.getRootServices(fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootServices($fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootServices(fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RootService/service_name)

try: 
    # Returns the list of root-level services
    api_response = api_instance.getRootServices(fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RootService/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServices_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServices_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootServices-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootServices-200-schema">
                                  <div id='responses-getRootServices-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/RootServiceResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootServices-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootServices-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootServices-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Settings">
                  <h1>Settings</h1>
                    <div id="api-Settings-createSetting">
                      <article id="api-Settings-createSetting-0" data-group="User" data-name="createSetting" data-version="0">
                        <div class="pull-left">
                          <h1>createSetting</h1>
                          <p>Creates a setting</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/settings</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Settings-createSetting-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Settings-createSetting-0-java">Java</a></li>
                          <li class=""><a href="#examples-Settings-createSetting-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Settings-createSetting-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Settings-createSetting-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Settings-createSetting-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Settings-createSetting-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Settings-createSetting-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Settings-createSetting-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Settings-createSetting-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Settings-createSetting-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Settings-createSetting-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/settings"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Settings-createSetting-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.SettingsApi;

import java.io.File;
import java.util.*;

public class SettingsApiExample {

    public static void main(String[] args) {
        
        SettingsApi apiInstance = new SettingsApi();
        SettingRequestSwagger body = ; // SettingRequestSwagger | 
        try {
            apiInstance.createSetting(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#createSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Settings-createSetting-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.SettingsApi;

public class SettingsApiExample {

    public static void main(String[] args) {
        SettingsApi apiInstance = new SettingsApi();
        SettingRequestSwagger body = ; // SettingRequestSwagger | 
        try {
            apiInstance.createSetting(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#createSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Settings-createSetting-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Settings-createSetting-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">SettingRequestSwagger *body = ; // 

SettingsApi *apiInstance = [[SettingsApi alloc] init];

// Creates a setting
[apiInstance createSettingWith:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-createSetting-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.SettingsApi()

var body = ; // {SettingRequestSwagger} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createSetting(body, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Settings-createSetting-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Settings-createSetting-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createSettingExample
    {
        public void main()
        {
            
            var apiInstance = new SettingsApi();
            var body = new SettingRequestSwagger(); // SettingRequestSwagger | 

            try
            {
                // Creates a setting
                apiInstance.createSetting(body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling SettingsApi.createSetting: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-createSetting-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\SettingsApi();
$body = ; // SettingRequestSwagger | 

try {
    $api_instance->createSetting($body);
} catch (Exception $e) {
    echo 'Exception when calling SettingsApi->createSetting: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-createSetting-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::SettingsApi;

my $api_instance = WWW::SwaggerClient::SettingsApi->new();
my $body = WWW::SwaggerClient::Object::SettingRequestSwagger->new(); # SettingRequestSwagger | 

eval { 
    $api_instance->createSetting(body => $body);
};
if ($@) {
    warn "Exception when calling SettingsApi->createSetting: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-createSetting-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.SettingsApi()
body =  # SettingRequestSwagger | 

try: 
    # Creates a setting
    api_instance.createSetting(body)
except ApiException as e:
    print("Exception when calling SettingsApi->createSetting: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body <span style="color:red;">*</span></td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : true,
  "schema" : {
    "$ref" : "#/definitions/SettingRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createSetting_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createSetting_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Settings-deleteSetting">
                      <article id="api-Settings-deleteSetting-0" data-group="User" data-name="deleteSetting" data-version="0">
                        <div class="pull-left">
                          <h1>deleteSetting</h1>
                          <p>Deletes a setting</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/settings/{settingName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Settings-deleteSetting-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Settings-deleteSetting-0-java">Java</a></li>
                          <li class=""><a href="#examples-Settings-deleteSetting-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Settings-deleteSetting-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Settings-deleteSetting-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Settings-deleteSetting-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Settings-deleteSetting-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Settings-deleteSetting-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Settings-deleteSetting-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Settings-deleteSetting-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Settings-deleteSetting-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Settings-deleteSetting-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/settings/{settingName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Settings-deleteSetting-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.SettingsApi;

import java.io.File;
import java.util.*;

public class SettingsApiExample {

    public static void main(String[] args) {
        
        SettingsApi apiInstance = new SettingsApi();
        String settingName = settingName_example; // String | setting name
        try {
            apiInstance.deleteSetting(settingName);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#deleteSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Settings-deleteSetting-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.SettingsApi;

public class SettingsApiExample {

    public static void main(String[] args) {
        SettingsApi apiInstance = new SettingsApi();
        String settingName = settingName_example; // String | setting name
        try {
            apiInstance.deleteSetting(settingName);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#deleteSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Settings-deleteSetting-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Settings-deleteSetting-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *settingName = settingName_example; // setting name

SettingsApi *apiInstance = [[SettingsApi alloc] init];

// Deletes a setting
[apiInstance deleteSettingWith:settingName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-deleteSetting-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.SettingsApi()

var settingName = settingName_example; // {String} setting name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteSetting(settingName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Settings-deleteSetting-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Settings-deleteSetting-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteSettingExample
    {
        public void main()
        {
            
            var apiInstance = new SettingsApi();
            var settingName = settingName_example;  // String | setting name

            try
            {
                // Deletes a setting
                apiInstance.deleteSetting(settingName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling SettingsApi.deleteSetting: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-deleteSetting-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\SettingsApi();
$settingName = settingName_example; // String | setting name

try {
    $api_instance->deleteSetting($settingName);
} catch (Exception $e) {
    echo 'Exception when calling SettingsApi->deleteSetting: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-deleteSetting-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::SettingsApi;

my $api_instance = WWW::SwaggerClient::SettingsApi->new();
my $settingName = settingName_example; # String | setting name

eval { 
    $api_instance->deleteSetting(settingName => $settingName);
};
if ($@) {
    warn "Exception when calling SettingsApi->deleteSetting: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-deleteSetting-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.SettingsApi()
settingName = settingName_example # String | setting name

try: 
    # Deletes a setting
    api_instance.deleteSetting(settingName)
except ApiException as e:
    print("Exception when calling SettingsApi->deleteSetting: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">settingName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "settingName",
  "in" : "path",
  "description" : "setting name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteSetting_settingName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteSetting_settingName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Settings-getSetting">
                      <article id="api-Settings-getSetting-0" data-group="User" data-name="getSetting" data-version="0">
                        <div class="pull-left">
                          <h1>getSetting</h1>
                          <p>Returns a specific setting</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/settings/{settingName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Settings-getSetting-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Settings-getSetting-0-java">Java</a></li>
                          <li class=""><a href="#examples-Settings-getSetting-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Settings-getSetting-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Settings-getSetting-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Settings-getSetting-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Settings-getSetting-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Settings-getSetting-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Settings-getSetting-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Settings-getSetting-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Settings-getSetting-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Settings-getSetting-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/settings/{settingName}?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Settings-getSetting-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.SettingsApi;

import java.io.File;
import java.util.*;

public class SettingsApiExample {

    public static void main(String[] args) {
        
        SettingsApi apiInstance = new SettingsApi();
        String settingName = settingName_example; // String | setting name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            SettingResponseWrapper result = apiInstance.getSetting(settingName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#getSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Settings-getSetting-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.SettingsApi;

public class SettingsApiExample {

    public static void main(String[] args) {
        SettingsApi apiInstance = new SettingsApi();
        String settingName = settingName_example; // String | setting name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            SettingResponseWrapper result = apiInstance.getSetting(settingName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#getSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Settings-getSetting-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Settings-getSetting-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *settingName = settingName_example; // setting name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Settings/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

SettingsApi *apiInstance = [[SettingsApi alloc] init];

// Returns a specific setting
[apiInstance getSettingWith:settingName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(SettingResponseWrapper output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSetting-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.SettingsApi()

var settingName = settingName_example; // {String} setting name

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getSetting(settingName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Settings-getSetting-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Settings-getSetting-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getSettingExample
    {
        public void main()
        {
            
            var apiInstance = new SettingsApi();
            var settingName = settingName_example;  // String | setting name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Settings/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns a specific setting
                SettingResponseWrapper result = apiInstance.getSetting(settingName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling SettingsApi.getSetting: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSetting-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\SettingsApi();
$settingName = settingName_example; // String | setting name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getSetting($settingName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling SettingsApi->getSetting: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSetting-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::SettingsApi;

my $api_instance = WWW::SwaggerClient::SettingsApi->new();
my $settingName = settingName_example; # String | setting name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getSetting(settingName => $settingName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling SettingsApi->getSetting: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSetting-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.SettingsApi()
settingName = settingName_example # String | setting name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Settings/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns a specific setting
    api_response = api_instance.getSetting(settingName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling SettingsApi->getSetting: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">settingName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "settingName",
  "in" : "path",
  "description" : "setting name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSetting_settingName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSetting_settingName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Settings/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSetting_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSetting_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSetting_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSetting_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSetting_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSetting_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSetting_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSetting_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSetting_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSetting_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getSetting-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getSetting-200-schema">
                                  <div id='responses-getSetting-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/SettingResponseWrapper"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getSetting-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getSetting-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getSetting-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Settings-getSettings">
                      <article id="api-Settings-getSettings-0" data-group="User" data-name="getSettings" data-version="0">
                        <div class="pull-left">
                          <h1>getSettings</h1>
                          <p>Returns all settings</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/settings</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Settings-getSettings-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Settings-getSettings-0-java">Java</a></li>
                          <li class=""><a href="#examples-Settings-getSettings-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Settings-getSettings-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Settings-getSettings-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Settings-getSettings-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Settings-getSettings-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Settings-getSettings-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Settings-getSettings-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Settings-getSettings-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Settings-getSettings-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Settings-getSettings-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/settings?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Settings-getSettings-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.SettingsApi;

import java.io.File;
import java.util.*;

public class SettingsApiExample {

    public static void main(String[] args) {
        
        SettingsApi apiInstance = new SettingsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[SettingResponseWrapper] result = apiInstance.getSettings(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#getSettings");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Settings-getSettings-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.SettingsApi;

public class SettingsApiExample {

    public static void main(String[] args) {
        SettingsApi apiInstance = new SettingsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[SettingResponseWrapper] result = apiInstance.getSettings(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#getSettings");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Settings-getSettings-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Settings-getSettings-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Settings/name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

SettingsApi *apiInstance = [[SettingsApi alloc] init];

// Returns all settings
[apiInstance getSettingsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[SettingResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSettings-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.SettingsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getSettings(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Settings-getSettings-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Settings-getSettings-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getSettingsExample
    {
        public void main()
        {
            
            var apiInstance = new SettingsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Settings/name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns all settings
                array[SettingResponseWrapper] result = apiInstance.getSettings(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling SettingsApi.getSettings: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSettings-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\SettingsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getSettings($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling SettingsApi->getSettings: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSettings-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::SettingsApi;

my $api_instance = WWW::SwaggerClient::SettingsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getSettings(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling SettingsApi->getSettings: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSettings-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.SettingsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Settings/name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns all settings
    api_response = api_instance.getSettings(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling SettingsApi->getSettings: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Settings/name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSettings_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSettings_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSettings_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSettings_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSettings_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSettings_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSettings_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSettings_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSettings_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSettings_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getSettings-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getSettings-200-schema">
                                  <div id='responses-getSettings-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/SettingResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getSettings-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getSettings-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getSettings-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Settings-updateSetting">
                      <article id="api-Settings-updateSetting-0" data-group="User" data-name="updateSetting" data-version="0">
                        <div class="pull-left">
                          <h1>updateSetting</h1>
                          <p>Updates a setting</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/settings/{settingName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Settings-updateSetting-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Settings-updateSetting-0-java">Java</a></li>
                          <li class=""><a href="#examples-Settings-updateSetting-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Settings-updateSetting-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Settings-updateSetting-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Settings-updateSetting-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Settings-updateSetting-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Settings-updateSetting-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Settings-updateSetting-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Settings-updateSetting-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Settings-updateSetting-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Settings-updateSetting-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/settings/{settingName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Settings-updateSetting-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.SettingsApi;

import java.io.File;
import java.util.*;

public class SettingsApiExample {

    public static void main(String[] args) {
        
        SettingsApi apiInstance = new SettingsApi();
        String settingName = settingName_example; // String | setting name
        SettingRequestSwagger body = ; // SettingRequestSwagger | 
        try {
            apiInstance.updateSetting(settingName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#updateSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Settings-updateSetting-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.SettingsApi;

public class SettingsApiExample {

    public static void main(String[] args) {
        SettingsApi apiInstance = new SettingsApi();
        String settingName = settingName_example; // String | setting name
        SettingRequestSwagger body = ; // SettingRequestSwagger | 
        try {
            apiInstance.updateSetting(settingName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#updateSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Settings-updateSetting-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Settings-updateSetting-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *settingName = settingName_example; // setting name
SettingRequestSwagger *body = ; // 

SettingsApi *apiInstance = [[SettingsApi alloc] init];

// Updates a setting
[apiInstance updateSettingWith:settingName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-updateSetting-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.SettingsApi()

var settingName = settingName_example; // {String} setting name

var body = ; // {SettingRequestSwagger} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateSetting(settingName, body, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Settings-updateSetting-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Settings-updateSetting-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateSettingExample
    {
        public void main()
        {
            
            var apiInstance = new SettingsApi();
            var settingName = settingName_example;  // String | setting name
            var body = new SettingRequestSwagger(); // SettingRequestSwagger | 

            try
            {
                // Updates a setting
                apiInstance.updateSetting(settingName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling SettingsApi.updateSetting: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-updateSetting-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\SettingsApi();
$settingName = settingName_example; // String | setting name
$body = ; // SettingRequestSwagger | 

try {
    $api_instance->updateSetting($settingName, $body);
} catch (Exception $e) {
    echo 'Exception when calling SettingsApi->updateSetting: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-updateSetting-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::SettingsApi;

my $api_instance = WWW::SwaggerClient::SettingsApi->new();
my $settingName = settingName_example; # String | setting name
my $body = WWW::SwaggerClient::Object::SettingRequestSwagger->new(); # SettingRequestSwagger | 

eval { 
    $api_instance->updateSetting(settingName => $settingName, body => $body);
};
if ($@) {
    warn "Exception when calling SettingsApi->updateSetting: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-updateSetting-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.SettingsApi()
settingName = settingName_example # String | setting name
body =  # SettingRequestSwagger | 

try: 
    # Updates a setting
    api_instance.updateSetting(settingName, body)
except ApiException as e:
    print("Exception when calling SettingsApi->updateSetting: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">settingName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "settingName",
  "in" : "path",
  "description" : "setting name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateSetting_settingName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateSetting_settingName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body <span style="color:red;">*</span></td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : true,
  "schema" : {
    "$ref" : "#/definitions/SettingRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateSetting_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateSetting_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Stacks">
                  <h1>Stacks</h1>
                    <div id="api-Stacks-stacksServiceGetServiceComponent">
                      <article id="api-Stacks-stacksServiceGetServiceComponent-0" data-group="User" data-name="stacksServiceGetServiceComponent" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetServiceComponent</h1>
                          <p>Get details for a stack service component</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns details for a stack service component.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components/{componentName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetServiceComponent-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components/{componentName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackServiceComponentResponseSwagger result = apiInstance.stacksServiceGetServiceComponent(stackName, stackVersion, serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackServiceComponentResponseSwagger result = apiInstance.stacksServiceGetServiceComponent(stackName, stackVersion, serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *componentName = componentName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackServiceComponents/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get details for a stack service component
[apiInstance stacksServiceGetServiceComponentWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    componentName:componentName
    fields:fields
              completionHandler: ^(StackServiceComponentResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var componentName = componentName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetServiceComponent(stackName, stackVersion, serviceName, componentName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetServiceComponentExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var componentName = componentName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackServiceComponents/*)

            try
            {
                // Get details for a stack service component
                StackServiceComponentResponseSwagger result = apiInstance.stacksServiceGetServiceComponent(stackName, stackVersion, serviceName, componentName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetServiceComponent: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$componentName = componentName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetServiceComponent($stackName, $stackVersion, $serviceName, $componentName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetServiceComponent: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $componentName = componentName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetServiceComponent(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, componentName => $componentName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetServiceComponent: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
componentName = componentName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackServiceComponents/*)

try: 
    # Get details for a stack service component
    api_response = api_instance.stacksServiceGetServiceComponent(stackName, stackVersion, serviceName, componentName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetServiceComponent: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponent_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponent_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponent_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponent_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponent_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponent_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponent_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponent_componentName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackServiceComponents/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponent_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponent_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetServiceComponent-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetServiceComponent-200-schema">
                                  <div id='responses-stacksServiceGetServiceComponent-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/StackServiceComponentResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetServiceComponent-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetServiceComponent-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetServiceComponent-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetServiceComponentDependencies">
                      <article id="api-Stacks-stacksServiceGetServiceComponentDependencies-0" data-group="User" data-name="stacksServiceGetServiceComponentDependencies" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetServiceComponentDependencies</h1>
                          <p>Get all dependencies for a stack service component</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all dependencies for a stack service component.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components/{componentName}/dependencies</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components/{componentName}/dependencies?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort component dependencies (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ComponentDependencyResponse] result = apiInstance.stacksServiceGetServiceComponentDependencies(stackName, stackVersion, serviceName, componentName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponentDependencies");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort component dependencies (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ComponentDependencyResponse] result = apiInstance.stacksServiceGetServiceComponentDependencies(stackName, stackVersion, serviceName, componentName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponentDependencies");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *componentName = componentName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to Dependencies/stack_name,Dependencies/stack_version,Dependencies/dependent_service_name,Dependencies/dependent_component_name,Dependencies/component_name)
String *sortBy = sortBy_example; // Sort component dependencies (asc | desc) (optional) (default to Dependencies/stack_name.asc,Dependencies/stack_version.asc,Dependencies/dependent_service_name.asc,Dependencies/dependent_component_name.asc,Dependencies/component_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all dependencies for a stack service component
[apiInstance stacksServiceGetServiceComponentDependenciesWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    componentName:componentName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ComponentDependencyResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var componentName = componentName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort component dependencies (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetServiceComponentDependencies(stackName, stackVersion, serviceName, componentName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetServiceComponentDependenciesExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var componentName = componentName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to Dependencies/stack_name,Dependencies/stack_version,Dependencies/dependent_service_name,Dependencies/dependent_component_name,Dependencies/component_name)
            var sortBy = sortBy_example;  // String | Sort component dependencies (asc | desc) (optional)  (default to Dependencies/stack_name.asc,Dependencies/stack_version.asc,Dependencies/dependent_service_name.asc,Dependencies/dependent_component_name.asc,Dependencies/component_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all dependencies for a stack service component
                array[ComponentDependencyResponse] result = apiInstance.stacksServiceGetServiceComponentDependencies(stackName, stackVersion, serviceName, componentName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetServiceComponentDependencies: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$componentName = componentName_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort component dependencies (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetServiceComponentDependencies($stackName, $stackVersion, $serviceName, $componentName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetServiceComponentDependencies: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $componentName = componentName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort component dependencies (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetServiceComponentDependencies(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, componentName => $componentName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetServiceComponentDependencies: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
componentName = componentName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to Dependencies/stack_name,Dependencies/stack_version,Dependencies/dependent_service_name,Dependencies/dependent_component_name,Dependencies/component_name)
sortBy = sortBy_example # String | Sort component dependencies (asc | desc) (optional) (default to Dependencies/stack_name.asc,Dependencies/stack_version.asc,Dependencies/dependent_service_name.asc,Dependencies/dependent_component_name.asc,Dependencies/component_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all dependencies for a stack service component
    api_response = api_instance.stacksServiceGetServiceComponentDependencies(stackName, stackVersion, serviceName, componentName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetServiceComponentDependencies: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_componentName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "Dependencies/stack_name,Dependencies/stack_version,Dependencies/dependent_service_name,Dependencies/dependent_component_name,Dependencies/component_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort component dependencies (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Dependencies/stack_name.asc,Dependencies/stack_version.asc,Dependencies/dependent_service_name.asc,Dependencies/dependent_component_name.asc,Dependencies/component_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetServiceComponentDependencies-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetServiceComponentDependencies-200-schema">
                                  <div id='responses-stacksServiceGetServiceComponentDependencies-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ComponentDependencyResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetServiceComponentDependencies-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetServiceComponentDependencies-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetServiceComponentDependencies-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetServiceComponentDependency">
                      <article id="api-Stacks-stacksServiceGetServiceComponentDependency-0" data-group="User" data-name="stacksServiceGetServiceComponentDependency" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetServiceComponentDependency</h1>
                          <p>Get a stack service component dependency</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns a stack service component dependency.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components/{componentName}/dependencies/{dependencyName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components/{componentName}/dependencies/{dependencyName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String dependencyName = dependencyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            ComponentDependencyResponse result = apiInstance.stacksServiceGetServiceComponentDependency(stackName, stackVersion, serviceName, componentName, dependencyName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponentDependency");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String dependencyName = dependencyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            ComponentDependencyResponse result = apiInstance.stacksServiceGetServiceComponentDependency(stackName, stackVersion, serviceName, componentName, dependencyName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponentDependency");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *componentName = componentName_example; // 
String *dependencyName = dependencyName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to Dependencies/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get a stack service component dependency
[apiInstance stacksServiceGetServiceComponentDependencyWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    componentName:componentName
    dependencyName:dependencyName
    fields:fields
              completionHandler: ^(ComponentDependencyResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var componentName = componentName_example; // {String} 

var dependencyName = dependencyName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetServiceComponentDependency(stackName, stackVersion, serviceName, componentName, dependencyName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetServiceComponentDependencyExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var componentName = componentName_example;  // String | 
            var dependencyName = dependencyName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to Dependencies/*)

            try
            {
                // Get a stack service component dependency
                ComponentDependencyResponse result = apiInstance.stacksServiceGetServiceComponentDependency(stackName, stackVersion, serviceName, componentName, dependencyName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetServiceComponentDependency: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$componentName = componentName_example; // String | 
$dependencyName = dependencyName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetServiceComponentDependency($stackName, $stackVersion, $serviceName, $componentName, $dependencyName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetServiceComponentDependency: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $componentName = componentName_example; # String | 
my $dependencyName = dependencyName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetServiceComponentDependency(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, componentName => $componentName, dependencyName => $dependencyName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetServiceComponentDependency: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
componentName = componentName_example # String | 
dependencyName = dependencyName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to Dependencies/*)

try: 
    # Get a stack service component dependency
    api_response = api_instance.stacksServiceGetServiceComponentDependency(stackName, stackVersion, serviceName, componentName, dependencyName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetServiceComponentDependency: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependency_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependency_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependency_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependency_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependency_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependency_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependency_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependency_componentName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">dependencyName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "dependencyName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependency_dependencyName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependency_dependencyName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "Dependencies/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependency_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependency_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetServiceComponentDependency-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetServiceComponentDependency-200-schema">
                                  <div id='responses-stacksServiceGetServiceComponentDependency-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ComponentDependencyResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetServiceComponentDependency-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetServiceComponentDependency-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetServiceComponentDependency-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetServiceComponents">
                      <article id="api-Stacks-stacksServiceGetServiceComponents-0" data-group="User" data-name="stacksServiceGetServiceComponents" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetServiceComponents</h1>
                          <p>Get all components for a stack service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all components for a stack service.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetServiceComponents-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service components (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackServiceComponentResponseSwagger] result = apiInstance.stacksServiceGetServiceComponents(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service components (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackServiceComponentResponseSwagger] result = apiInstance.stacksServiceGetServiceComponents(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackServiceComponents/component_name,StackServiceComponents/service_name,StackServiceComponents/stack_name,StackServiceComponents/stack_version)
String *sortBy = sortBy_example; // Sort service components (asc | desc) (optional) (default to StackServiceComponents/component_name.asc,StackServiceComponents/service_name.asc,StackServiceComponents/stack_name.asc,StackServiceComponents/stack_version.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all components for a stack service
[apiInstance stacksServiceGetServiceComponentsWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackServiceComponentResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort service components (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetServiceComponents(stackName, stackVersion, serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetServiceComponentsExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackServiceComponents/component_name,StackServiceComponents/service_name,StackServiceComponents/stack_name,StackServiceComponents/stack_version)
            var sortBy = sortBy_example;  // String | Sort service components (asc | desc) (optional)  (default to StackServiceComponents/component_name.asc,StackServiceComponents/service_name.asc,StackServiceComponents/stack_name.asc,StackServiceComponents/stack_version.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all components for a stack service
                array[StackServiceComponentResponseSwagger] result = apiInstance.stacksServiceGetServiceComponents(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetServiceComponents: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort service components (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetServiceComponents($stackName, $stackVersion, $serviceName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetServiceComponents: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort service components (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetServiceComponents(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetServiceComponents: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackServiceComponents/component_name,StackServiceComponents/service_name,StackServiceComponents/stack_name,StackServiceComponents/stack_version)
sortBy = sortBy_example # String | Sort service components (asc | desc) (optional) (default to StackServiceComponents/component_name.asc,StackServiceComponents/service_name.asc,StackServiceComponents/stack_name.asc,StackServiceComponents/stack_version.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all components for a stack service
    api_response = api_instance.stacksServiceGetServiceComponents(stackName, stackVersion, serviceName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetServiceComponents: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackServiceComponents/component_name,StackServiceComponents/service_name,StackServiceComponents/stack_name,StackServiceComponents/stack_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort service components (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "StackServiceComponents/component_name.asc,StackServiceComponents/service_name.asc,StackServiceComponents/stack_name.asc,StackServiceComponents/stack_version.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetServiceComponents-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetServiceComponents-200-schema">
                                  <div id='responses-stacksServiceGetServiceComponents-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackServiceComponentResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetServiceComponents-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetServiceComponents-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetServiceComponents-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStack">
                      <article id="api-Stacks-stacksServiceGetStack-0" data-group="User" data-name="stacksServiceGetStack" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStack</h1>
                          <p>Get a stack</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns stack details.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStack-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStack-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String fields = fields_example; // String | Filter stack details
        try {
            array[StackResponseSwagger] result = apiInstance.stacksServiceGetStack(stackName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStack");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String fields = fields_example; // String | Filter stack details
        try {
            array[StackResponseSwagger] result = apiInstance.stacksServiceGetStack(stackName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStack");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *fields = fields_example; // Filter stack details (optional) (default to Stacks/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get a stack
[apiInstance stacksServiceGetStackWith:stackName
    fields:fields
              completionHandler: ^(array[StackResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter stack details
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStack(stackName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var fields = fields_example;  // String | Filter stack details (optional)  (default to Stacks/*)

            try
            {
                // Get a stack
                array[StackResponseSwagger] result = apiInstance.stacksServiceGetStack(stackName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStack: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$fields = fields_example; // String | Filter stack details

try {
    $result = $api_instance->stacksServiceGetStack($stackName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStack: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $fields = fields_example; # String | Filter stack details

eval { 
    my $result = $api_instance->stacksServiceGetStack(stackName => $stackName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStack: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
fields = fields_example # String | Filter stack details (optional) (default to Stacks/*)

try: 
    # Get a stack
    api_response = api_instance.stacksServiceGetStack(stackName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStack: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStack_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStack_stackName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter stack details",
  "required" : false,
  "type" : "string",
  "default" : "Stacks/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStack_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStack_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStack-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStack-200-schema">
                                  <div id='responses-stacksServiceGetStack-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStack-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStack-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStack-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackArtifact">
                      <article id="api-Stacks-stacksServiceGetStackArtifact-0" data-group="User" data-name="stacksServiceGetStackArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackArtifact</h1>
                          <p>Get stack artifact details</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the details of a stack artifact</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/artifacts/{artifactName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String artifactName = artifactName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackArtifactResponse result = apiInstance.stacksServiceGetStackArtifact(stackName, stackVersion, artifactName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String artifactName = artifactName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackArtifactResponse result = apiInstance.stacksServiceGetStackArtifact(stackName, stackVersion, artifactName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *artifactName = artifactName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to Artifacts/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get stack artifact details
[apiInstance stacksServiceGetStackArtifactWith:stackName
    stackVersion:stackVersion
    artifactName:artifactName
    fields:fields
              completionHandler: ^(StackArtifactResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var artifactName = artifactName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackArtifact(stackName, stackVersion, artifactName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to Artifacts/*)

            try
            {
                // Get stack artifact details
                StackArtifactResponse result = apiInstance.stacksServiceGetStackArtifact(stackName, stackVersion, artifactName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$artifactName = artifactName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackArtifact($stackName, $stackVersion, $artifactName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $artifactName = artifactName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackArtifact(stackName => $stackName, stackVersion => $stackVersion, artifactName => $artifactName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
artifactName = artifactName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to Artifacts/*)

try: 
    # Get stack artifact details
    api_response = api_instance.stacksServiceGetStackArtifact(stackName, stackVersion, artifactName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackArtifact_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackArtifact_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackArtifact_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackArtifact_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackArtifact_artifactName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackArtifact_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackArtifact_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackArtifact-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackArtifact-200-schema">
                                  <div id='responses-stacksServiceGetStackArtifact-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/StackArtifactResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackArtifact-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackArtifact-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackArtifact-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackArtifacts">
                      <article id="api-Stacks-stacksServiceGetStackArtifacts-0" data-group="User" data-name="stacksServiceGetStackArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackArtifacts</h1>
                          <p>Get all stack artifacts</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all stack artifacts (e.g: kerberos descriptor, metrics descriptor)</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/artifacts?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            array[StackArtifactResponse] result = apiInstance.stacksServiceGetStackArtifacts(stackName, stackVersion, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            array[StackArtifactResponse] result = apiInstance.stacksServiceGetStackArtifacts(stackName, stackVersion, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all stack artifacts
[apiInstance stacksServiceGetStackArtifactsWith:stackName
    stackVersion:stackVersion
    fields:fields
              completionHandler: ^(array[StackArtifactResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackArtifacts(stackName, stackVersion, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version)

            try
            {
                // Get all stack artifacts
                array[StackArtifactResponse] result = apiInstance.stacksServiceGetStackArtifacts(stackName, stackVersion, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackArtifacts($stackName, $stackVersion, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackArtifacts(stackName => $stackName, stackVersion => $stackVersion, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version)

try: 
    # Get all stack artifacts
    api_response = api_instance.stacksServiceGetStackArtifacts(stackName, stackVersion, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackArtifacts_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackArtifacts_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackArtifacts_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackArtifacts_stackVersion"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackArtifacts_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackArtifacts_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackArtifacts-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackArtifacts-200-schema">
                                  <div id='responses-stacksServiceGetStackArtifacts-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackArtifactResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackArtifacts-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackArtifacts-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackArtifacts-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackConfiguration">
                      <article id="api-Stacks-stacksServiceGetStackConfiguration-0" data-group="User" data-name="stacksServiceGetStackConfiguration" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackConfiguration</h1>
                          <p>Get stack service configuration details</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the details of a stack service configuration.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/configurations/{propertyName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackConfiguration-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/configurations/{propertyName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String propertyName = propertyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackConfigurationResponseSwagger result = apiInstance.stacksServiceGetStackConfiguration(stackName, stackVersion, serviceName, propertyName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String propertyName = propertyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackConfigurationResponseSwagger result = apiInstance.stacksServiceGetStackConfiguration(stackName, stackVersion, serviceName, propertyName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *propertyName = propertyName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackConfigurations/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get stack service configuration details
[apiInstance stacksServiceGetStackConfigurationWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    propertyName:propertyName
    fields:fields
              completionHandler: ^(StackConfigurationResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var propertyName = propertyName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackConfiguration(stackName, stackVersion, serviceName, propertyName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackConfigurationExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var propertyName = propertyName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackConfigurations/*)

            try
            {
                // Get stack service configuration details
                StackConfigurationResponseSwagger result = apiInstance.stacksServiceGetStackConfiguration(stackName, stackVersion, serviceName, propertyName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackConfiguration: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$propertyName = propertyName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackConfiguration($stackName, $stackVersion, $serviceName, $propertyName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackConfiguration: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $propertyName = propertyName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackConfiguration(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, propertyName => $propertyName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackConfiguration: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
propertyName = propertyName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackConfigurations/*)

try: 
    # Get stack service configuration details
    api_response = api_instance.stacksServiceGetStackConfiguration(stackName, stackVersion, serviceName, propertyName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackConfiguration: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfiguration_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfiguration_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfiguration_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfiguration_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfiguration_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfiguration_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">propertyName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "propertyName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfiguration_propertyName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfiguration_propertyName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackConfigurations/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfiguration_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfiguration_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackConfiguration-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackConfiguration-200-schema">
                                  <div id='responses-stacksServiceGetStackConfiguration-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/StackConfigurationResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackConfiguration-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackConfiguration-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackConfiguration-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackConfigurationDependencies">
                      <article id="api-Stacks-stacksServiceGetStackConfigurationDependencies-0" data-group="User" data-name="stacksServiceGetStackConfigurationDependencies" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackConfigurationDependencies</h1>
                          <p>Get all dependencies for a stack service configuration</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all dependencies for a stack service configuration.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/configurations/{propertyName}/dependencies</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/configurations/{propertyName}/dependencies?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String propertyName = propertyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort configuration dependencies (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackConfigurationDependencyResponseSwagger] result = apiInstance.stacksServiceGetStackConfigurationDependencies(stackName, stackVersion, serviceName, propertyName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackConfigurationDependencies");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String propertyName = propertyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort configuration dependencies (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackConfigurationDependencyResponseSwagger] result = apiInstance.stacksServiceGetStackConfigurationDependencies(stackName, stackVersion, serviceName, propertyName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackConfigurationDependencies");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *propertyName = propertyName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackConfigurationDependency/stack_name,StackConfigurationDependency/stack_version,StackConfigurationDependency/service_name,StackConfigurationDependency/property_name,StackConfigurationDependency/dependency_name)
String *sortBy = sortBy_example; // Sort configuration dependencies (asc | desc) (optional) (default to StackConfigurationDependency/stack_name.asc,StackConfigurationDependency/stack_version.asc,StackConfigurationDependency/service_name.asc,StackConfigurationDependency/property_name.asc,StackConfigurationDependency/dependency_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all dependencies for a stack service configuration
[apiInstance stacksServiceGetStackConfigurationDependenciesWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    propertyName:propertyName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackConfigurationDependencyResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var propertyName = propertyName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort configuration dependencies (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackConfigurationDependencies(stackName, stackVersion, serviceName, propertyName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackConfigurationDependenciesExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var propertyName = propertyName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackConfigurationDependency/stack_name,StackConfigurationDependency/stack_version,StackConfigurationDependency/service_name,StackConfigurationDependency/property_name,StackConfigurationDependency/dependency_name)
            var sortBy = sortBy_example;  // String | Sort configuration dependencies (asc | desc) (optional)  (default to StackConfigurationDependency/stack_name.asc,StackConfigurationDependency/stack_version.asc,StackConfigurationDependency/service_name.asc,StackConfigurationDependency/property_name.asc,StackConfigurationDependency/dependency_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all dependencies for a stack service configuration
                array[StackConfigurationDependencyResponseSwagger] result = apiInstance.stacksServiceGetStackConfigurationDependencies(stackName, stackVersion, serviceName, propertyName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackConfigurationDependencies: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$propertyName = propertyName_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort configuration dependencies (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackConfigurationDependencies($stackName, $stackVersion, $serviceName, $propertyName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackConfigurationDependencies: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $propertyName = propertyName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort configuration dependencies (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackConfigurationDependencies(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, propertyName => $propertyName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackConfigurationDependencies: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
propertyName = propertyName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackConfigurationDependency/stack_name,StackConfigurationDependency/stack_version,StackConfigurationDependency/service_name,StackConfigurationDependency/property_name,StackConfigurationDependency/dependency_name)
sortBy = sortBy_example # String | Sort configuration dependencies (asc | desc) (optional) (default to StackConfigurationDependency/stack_name.asc,StackConfigurationDependency/stack_version.asc,StackConfigurationDependency/service_name.asc,StackConfigurationDependency/property_name.asc,StackConfigurationDependency/dependency_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all dependencies for a stack service configuration
    api_response = api_instance.stacksServiceGetStackConfigurationDependencies(stackName, stackVersion, serviceName, propertyName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackConfigurationDependencies: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">propertyName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "propertyName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_propertyName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_propertyName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackConfigurationDependency/stack_name,StackConfigurationDependency/stack_version,StackConfigurationDependency/service_name,StackConfigurationDependency/property_name,StackConfigurationDependency/dependency_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort configuration dependencies (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "StackConfigurationDependency/stack_name.asc,StackConfigurationDependency/stack_version.asc,StackConfigurationDependency/service_name.asc,StackConfigurationDependency/property_name.asc,StackConfigurationDependency/dependency_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackConfigurationDependencies-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackConfigurationDependencies-200-schema">
                                  <div id='responses-stacksServiceGetStackConfigurationDependencies-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackConfigurationDependencyResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackConfigurationDependencies-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackConfigurationDependencies-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackConfigurationDependencies-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackConfigurations">
                      <article id="api-Stacks-stacksServiceGetStackConfigurations-0" data-group="User" data-name="stacksServiceGetStackConfigurations" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackConfigurations</h1>
                          <p>Get all configurations for a stack service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all configurations for a stack service.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/configurations</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackConfigurations-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/configurations?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service configurations (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackConfigurationResponseSwagger] result = apiInstance.stacksServiceGetStackConfigurations(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service configurations (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackConfigurationResponseSwagger] result = apiInstance.stacksServiceGetStackConfigurations(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackConfigurations/property_name,StackConfigurations/service_name,StackConfigurations/stack_nameStackConfigurations/stack_version)
String *sortBy = sortBy_example; // Sort service configurations (asc | desc) (optional) (default to StackConfigurations/property_name.asc,StackConfigurations/service_name.asc,StackConfigurations/stack_name.ascStackConfigurations/stack_version.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all configurations for a stack service
[apiInstance stacksServiceGetStackConfigurationsWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackConfigurationResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort service configurations (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackConfigurations(stackName, stackVersion, serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackConfigurationsExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackConfigurations/property_name,StackConfigurations/service_name,StackConfigurations/stack_nameStackConfigurations/stack_version)
            var sortBy = sortBy_example;  // String | Sort service configurations (asc | desc) (optional)  (default to StackConfigurations/property_name.asc,StackConfigurations/service_name.asc,StackConfigurations/stack_name.ascStackConfigurations/stack_version.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all configurations for a stack service
                array[StackConfigurationResponseSwagger] result = apiInstance.stacksServiceGetStackConfigurations(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackConfigurations: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort service configurations (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackConfigurations($stackName, $stackVersion, $serviceName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackConfigurations: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort service configurations (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackConfigurations(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackConfigurations: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackConfigurations/property_name,StackConfigurations/service_name,StackConfigurations/stack_nameStackConfigurations/stack_version)
sortBy = sortBy_example # String | Sort service configurations (asc | desc) (optional) (default to StackConfigurations/property_name.asc,StackConfigurations/service_name.asc,StackConfigurations/stack_name.ascStackConfigurations/stack_version.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all configurations for a stack service
    api_response = api_instance.stacksServiceGetStackConfigurations(stackName, stackVersion, serviceName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackConfigurations: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackConfigurations/property_name,StackConfigurations/service_name,StackConfigurations/stack_nameStackConfigurations/stack_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort service configurations (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "StackConfigurations/property_name.asc,StackConfigurations/service_name.asc,StackConfigurations/stack_name.ascStackConfigurations/stack_version.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackConfigurations-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackConfigurations-200-schema">
                                  <div id='responses-stacksServiceGetStackConfigurations-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackConfigurationResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackConfigurations-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackConfigurations-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackConfigurations-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackLevelConfiguration">
                      <article id="api-Stacks-stacksServiceGetStackLevelConfiguration-0" data-group="User" data-name="stacksServiceGetStackLevelConfiguration" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackLevelConfiguration</h1>
                          <p>Get configuration details for a given property</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the configuration details for a given property.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/configurations/{propertyName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/configurations/{propertyName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String propertyName = propertyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackConfigurationResponseSwagger result = apiInstance.stacksServiceGetStackLevelConfiguration(stackName, stackVersion, serviceName, propertyName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackLevelConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String propertyName = propertyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackConfigurationResponseSwagger result = apiInstance.stacksServiceGetStackLevelConfiguration(stackName, stackVersion, serviceName, propertyName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackLevelConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *propertyName = propertyName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackLevelConfigurations/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get configuration details for a given property
[apiInstance stacksServiceGetStackLevelConfigurationWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    propertyName:propertyName
    fields:fields
              completionHandler: ^(StackConfigurationResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var propertyName = propertyName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackLevelConfiguration(stackName, stackVersion, serviceName, propertyName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackLevelConfigurationExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var propertyName = propertyName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackLevelConfigurations/*)

            try
            {
                // Get configuration details for a given property
                StackConfigurationResponseSwagger result = apiInstance.stacksServiceGetStackLevelConfiguration(stackName, stackVersion, serviceName, propertyName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackLevelConfiguration: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$propertyName = propertyName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackLevelConfiguration($stackName, $stackVersion, $serviceName, $propertyName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackLevelConfiguration: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $propertyName = propertyName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackLevelConfiguration(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, propertyName => $propertyName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackLevelConfiguration: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
propertyName = propertyName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackLevelConfigurations/*)

try: 
    # Get configuration details for a given property
    api_response = api_instance.stacksServiceGetStackLevelConfiguration(stackName, stackVersion, serviceName, propertyName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackLevelConfiguration: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfiguration_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfiguration_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfiguration_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfiguration_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfiguration_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfiguration_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">propertyName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "propertyName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfiguration_propertyName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfiguration_propertyName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackLevelConfigurations/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfiguration_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfiguration_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackLevelConfiguration-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackLevelConfiguration-200-schema">
                                  <div id='responses-stacksServiceGetStackLevelConfiguration-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/StackConfigurationResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackLevelConfiguration-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackLevelConfiguration-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackLevelConfiguration-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackLevelConfigurations">
                      <article id="api-Stacks-stacksServiceGetStackLevelConfigurations-0" data-group="User" data-name="stacksServiceGetStackLevelConfigurations" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackLevelConfigurations</h1>
                          <p>Get all configurations for a stack version</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all configurations for a stack version.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/configurations</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/configurations?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort configuration (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackConfigurationResponseSwagger] result = apiInstance.stacksServiceGetStackLevelConfigurations(stackName, stackVersion, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackLevelConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort configuration (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackConfigurationResponseSwagger] result = apiInstance.stacksServiceGetStackLevelConfigurations(stackName, stackVersion, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackLevelConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackLevelConfigurations/stack_name,StackLevelConfigurations/stack_version,StackLevelConfigurations/property_name)
String *sortBy = sortBy_example; // Sort configuration (asc | desc) (optional) (default to StackLevelConfigurations/stack_name.asc,StackLevelConfigurations/stack_version.asc,StackLevelConfigurations/property_name.asc )
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all configurations for a stack version
[apiInstance stacksServiceGetStackLevelConfigurationsWith:stackName
    stackVersion:stackVersion
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackConfigurationResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort configuration (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackLevelConfigurations(stackName, stackVersion, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackLevelConfigurationsExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackLevelConfigurations/stack_name,StackLevelConfigurations/stack_version,StackLevelConfigurations/property_name)
            var sortBy = sortBy_example;  // String | Sort configuration (asc | desc) (optional)  (default to StackLevelConfigurations/stack_name.asc,StackLevelConfigurations/stack_version.asc,StackLevelConfigurations/property_name.asc )
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all configurations for a stack version
                array[StackConfigurationResponseSwagger] result = apiInstance.stacksServiceGetStackLevelConfigurations(stackName, stackVersion, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackLevelConfigurations: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort configuration (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackLevelConfigurations($stackName, $stackVersion, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackLevelConfigurations: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort configuration (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackLevelConfigurations(stackName => $stackName, stackVersion => $stackVersion, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackLevelConfigurations: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackLevelConfigurations/stack_name,StackLevelConfigurations/stack_version,StackLevelConfigurations/property_name)
sortBy = sortBy_example # String | Sort configuration (asc | desc) (optional) (default to StackLevelConfigurations/stack_name.asc,StackLevelConfigurations/stack_version.asc,StackLevelConfigurations/property_name.asc )
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all configurations for a stack version
    api_response = api_instance.stacksServiceGetStackLevelConfigurations(stackName, stackVersion, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackLevelConfigurations: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfigurations_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfigurations_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfigurations_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfigurations_stackVersion"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackLevelConfigurations/stack_name,StackLevelConfigurations/stack_version,StackLevelConfigurations/property_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfigurations_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfigurations_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort configuration (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "StackLevelConfigurations/stack_name.asc,StackLevelConfigurations/stack_version.asc,StackLevelConfigurations/property_name.asc "
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfigurations_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfigurations_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfigurations_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfigurations_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfigurations_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfigurations_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfigurations_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfigurations_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackLevelConfigurations-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackLevelConfigurations-200-schema">
                                  <div id='responses-stacksServiceGetStackLevelConfigurations-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackConfigurationResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackLevelConfigurations-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackLevelConfigurations-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackLevelConfigurations-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackService">
                      <article id="api-Stacks-stacksServiceGetStackService-0" data-group="User" data-name="stacksServiceGetStackService" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackService</h1>
                          <p>Get stack service details</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the details of a stack service.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackServiceResponseSwagger result = apiInstance.stacksServiceGetStackService(stackName, stackVersion, serviceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackServiceResponseSwagger result = apiInstance.stacksServiceGetStackService(stackName, stackVersion, serviceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackServices/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get stack service details
[apiInstance stacksServiceGetStackServiceWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    fields:fields
              completionHandler: ^(StackServiceResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackService(stackName, stackVersion, serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServiceExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackServices/*)

            try
            {
                // Get stack service details
                StackServiceResponseSwagger result = apiInstance.stacksServiceGetStackService(stackName, stackVersion, serviceName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackService($stackName, $stackVersion, $serviceName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackService(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackServices/*)

try: 
    # Get stack service details
    api_response = api_instance.stacksServiceGetStackService(stackName, stackVersion, serviceName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackService_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackService_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackService_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackService_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackService_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackService_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackServices/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackService_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackService_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackService-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackService-200-schema">
                                  <div id='responses-stacksServiceGetStackService-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/StackServiceResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackService-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackService-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackService-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackServiceArtifact">
                      <article id="api-Stacks-stacksServiceGetStackServiceArtifact-0" data-group="User" data-name="stacksServiceGetStackServiceArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackServiceArtifact</h1>
                          <p>Get stack service artifact details</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the details of a stack service artifact.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/artifacts/{artifactName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackArtifactResponse result = apiInstance.stacksServiceGetStackServiceArtifact(stackName, stackVersion, serviceName, artifactName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackArtifactResponse result = apiInstance.stacksServiceGetStackServiceArtifact(stackName, stackVersion, serviceName, artifactName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *artifactName = artifactName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to Artifacts/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get stack service artifact details
[apiInstance stacksServiceGetStackServiceArtifactWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    artifactName:artifactName
    fields:fields
              completionHandler: ^(StackArtifactResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackServiceArtifact(stackName, stackVersion, serviceName, artifactName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServiceArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to Artifacts/*)

            try
            {
                // Get stack service artifact details
                StackArtifactResponse result = apiInstance.stacksServiceGetStackServiceArtifact(stackName, stackVersion, serviceName, artifactName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackServiceArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$artifactName = artifactName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackServiceArtifact($stackName, $stackVersion, $serviceName, $artifactName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackServiceArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackServiceArtifact(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, artifactName => $artifactName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackServiceArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
artifactName = artifactName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to Artifacts/*)

try: 
    # Get stack service artifact details
    api_response = api_instance.stacksServiceGetStackServiceArtifact(stackName, stackVersion, serviceName, artifactName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackServiceArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifact_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifact_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifact_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifact_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifact_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifact_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifact_artifactName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifact_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifact_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackServiceArtifact-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackServiceArtifact-200-schema">
                                  <div id='responses-stacksServiceGetStackServiceArtifact-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/StackArtifactResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackServiceArtifact-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackServiceArtifact-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackServiceArtifact-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackServiceArtifacts">
                      <article id="api-Stacks-stacksServiceGetStackServiceArtifacts-0" data-group="User" data-name="stacksServiceGetStackServiceArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackServiceArtifacts</h1>
                          <p>Get all artifacts for a stack service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all stack service artifacts</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/artifacts?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service artifacts (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackServiceArtifactResponse] result = apiInstance.stacksServiceGetStackServiceArtifacts(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service artifacts (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackServiceArtifactResponse] result = apiInstance.stacksServiceGetStackServiceArtifacts(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version)
String *sortBy = sortBy_example; // Sort service artifacts (asc | desc) (optional) (default to Artifacts/artifact_name.asc,Artifacts/stack_name.asc,Artifacts/stack_version.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all artifacts for a stack service
[apiInstance stacksServiceGetStackServiceArtifactsWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackServiceArtifactResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort service artifacts (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackServiceArtifacts(stackName, stackVersion, serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServiceArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version)
            var sortBy = sortBy_example;  // String | Sort service artifacts (asc | desc) (optional)  (default to Artifacts/artifact_name.asc,Artifacts/stack_name.asc,Artifacts/stack_version.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all artifacts for a stack service
                array[StackServiceArtifactResponse] result = apiInstance.stacksServiceGetStackServiceArtifacts(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackServiceArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort service artifacts (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackServiceArtifacts($stackName, $stackVersion, $serviceName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackServiceArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort service artifacts (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackServiceArtifacts(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackServiceArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version)
sortBy = sortBy_example # String | Sort service artifacts (asc | desc) (optional) (default to Artifacts/artifact_name.asc,Artifacts/stack_name.asc,Artifacts/stack_version.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all artifacts for a stack service
    api_response = api_instance.stacksServiceGetStackServiceArtifacts(stackName, stackVersion, serviceName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackServiceArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort service artifacts (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/artifact_name.asc,Artifacts/stack_name.asc,Artifacts/stack_version.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackServiceArtifacts-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackServiceArtifacts-200-schema">
                                  <div id='responses-stacksServiceGetStackServiceArtifacts-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackServiceArtifactResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackServiceArtifacts-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackServiceArtifacts-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackServiceArtifacts-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration">
                      <article id="api-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0" data-group="User" data-name="stacksServiceGetStackServiceQuickLinksConfiguration" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackServiceQuickLinksConfiguration</h1>
                          <p>Get quicklinks configuration details</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the details of a quicklinks configuration.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/quicklinks/{quickLinksConfigurationName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/quicklinks/{quickLinksConfigurationName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String quickLinksConfigurationName = quickLinksConfigurationName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            array[QuickLinksResponse] result = apiInstance.stacksServiceGetStackServiceQuickLinksConfiguration(stackName, stackVersion, serviceName, quickLinksConfigurationName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceQuickLinksConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String quickLinksConfigurationName = quickLinksConfigurationName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            array[QuickLinksResponse] result = apiInstance.stacksServiceGetStackServiceQuickLinksConfiguration(stackName, stackVersion, serviceName, quickLinksConfigurationName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceQuickLinksConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *quickLinksConfigurationName = quickLinksConfigurationName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to QuickLinkInfo/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get quicklinks configuration details
[apiInstance stacksServiceGetStackServiceQuickLinksConfigurationWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    quickLinksConfigurationName:quickLinksConfigurationName
    fields:fields
              completionHandler: ^(array[QuickLinksResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var quickLinksConfigurationName = quickLinksConfigurationName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackServiceQuickLinksConfiguration(stackName, stackVersion, serviceName, quickLinksConfigurationName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServiceQuickLinksConfigurationExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var quickLinksConfigurationName = quickLinksConfigurationName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to QuickLinkInfo/*)

            try
            {
                // Get quicklinks configuration details
                array[QuickLinksResponse] result = apiInstance.stacksServiceGetStackServiceQuickLinksConfiguration(stackName, stackVersion, serviceName, quickLinksConfigurationName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackServiceQuickLinksConfiguration: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$quickLinksConfigurationName = quickLinksConfigurationName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackServiceQuickLinksConfiguration($stackName, $stackVersion, $serviceName, $quickLinksConfigurationName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackServiceQuickLinksConfiguration: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $quickLinksConfigurationName = quickLinksConfigurationName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackServiceQuickLinksConfiguration(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, quickLinksConfigurationName => $quickLinksConfigurationName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackServiceQuickLinksConfiguration: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
quickLinksConfigurationName = quickLinksConfigurationName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to QuickLinkInfo/*)

try: 
    # Get quicklinks configuration details
    api_response = api_instance.stacksServiceGetStackServiceQuickLinksConfiguration(stackName, stackVersion, serviceName, quickLinksConfigurationName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackServiceQuickLinksConfiguration: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">quickLinksConfigurationName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "quickLinksConfigurationName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_quickLinksConfigurationName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_quickLinksConfigurationName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "QuickLinkInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackServiceQuickLinksConfiguration-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackServiceQuickLinksConfiguration-200-schema">
                                  <div id='responses-stacksServiceGetStackServiceQuickLinksConfiguration-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/QuickLinksResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackServiceQuickLinksConfiguration-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackServiceQuickLinksConfiguration-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackServiceQuickLinksConfiguration-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations">
                      <article id="api-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0" data-group="User" data-name="stacksServiceGetStackServiceQuickLinksConfigurations" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackServiceQuickLinksConfigurations</h1>
                          <p>Get all quicklinks configurations for a stack service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all quicklinks configurations for a stack service.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/quicklinks</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/quicklinks?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort quick links (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[QuickLinksResponse] result = apiInstance.stacksServiceGetStackServiceQuickLinksConfigurations(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceQuickLinksConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort quick links (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[QuickLinksResponse] result = apiInstance.stacksServiceGetStackServiceQuickLinksConfigurations(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceQuickLinksConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to QuickLinkInfo/file_name,QuickLinkInfo/service_name,QuickLinkInfo/stack_name,QuickLinkInfo/stack_version)
String *sortBy = sortBy_example; // Sort quick links (asc | desc) (optional) (default to QuickLinkInfo/file_name.asc,QuickLinkInfo/service_name.asc,QuickLinkInfo/stack_name.asc,QuickLinkInfo/stack_version.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all quicklinks configurations for a stack service
[apiInstance stacksServiceGetStackServiceQuickLinksConfigurationsWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[QuickLinksResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort quick links (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackServiceQuickLinksConfigurations(stackName, stackVersion, serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServiceQuickLinksConfigurationsExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to QuickLinkInfo/file_name,QuickLinkInfo/service_name,QuickLinkInfo/stack_name,QuickLinkInfo/stack_version)
            var sortBy = sortBy_example;  // String | Sort quick links (asc | desc) (optional)  (default to QuickLinkInfo/file_name.asc,QuickLinkInfo/service_name.asc,QuickLinkInfo/stack_name.asc,QuickLinkInfo/stack_version.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all quicklinks configurations for a stack service
                array[QuickLinksResponse] result = apiInstance.stacksServiceGetStackServiceQuickLinksConfigurations(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackServiceQuickLinksConfigurations: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort quick links (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackServiceQuickLinksConfigurations($stackName, $stackVersion, $serviceName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackServiceQuickLinksConfigurations: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort quick links (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackServiceQuickLinksConfigurations(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackServiceQuickLinksConfigurations: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to QuickLinkInfo/file_name,QuickLinkInfo/service_name,QuickLinkInfo/stack_name,QuickLinkInfo/stack_version)
sortBy = sortBy_example # String | Sort quick links (asc | desc) (optional) (default to QuickLinkInfo/file_name.asc,QuickLinkInfo/service_name.asc,QuickLinkInfo/stack_name.asc,QuickLinkInfo/stack_version.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all quicklinks configurations for a stack service
    api_response = api_instance.stacksServiceGetStackServiceQuickLinksConfigurations(stackName, stackVersion, serviceName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackServiceQuickLinksConfigurations: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "QuickLinkInfo/file_name,QuickLinkInfo/service_name,QuickLinkInfo/stack_name,QuickLinkInfo/stack_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort quick links (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "QuickLinkInfo/file_name.asc,QuickLinkInfo/service_name.asc,QuickLinkInfo/stack_name.asc,QuickLinkInfo/stack_version.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackServiceQuickLinksConfigurations-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackServiceQuickLinksConfigurations-200-schema">
                                  <div id='responses-stacksServiceGetStackServiceQuickLinksConfigurations-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/QuickLinksResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackServiceQuickLinksConfigurations-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackServiceQuickLinksConfigurations-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackServiceQuickLinksConfigurations-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackServiceTheme">
                      <article id="api-Stacks-stacksServiceGetStackServiceTheme-0" data-group="User" data-name="stacksServiceGetStackServiceTheme" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackServiceTheme</h1>
                          <p>Get theme details for a stack service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns stack service theme details.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/themes/{themeName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/themes/{themeName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String themeName = themeName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            ThemeResponse result = apiInstance.stacksServiceGetStackServiceTheme(stackName, stackVersion, serviceName, themeName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceTheme");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String themeName = themeName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            ThemeResponse result = apiInstance.stacksServiceGetStackServiceTheme(stackName, stackVersion, serviceName, themeName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceTheme");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *themeName = themeName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to ThemeInfo/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get theme details for a stack service
[apiInstance stacksServiceGetStackServiceThemeWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    themeName:themeName
    fields:fields
              completionHandler: ^(ThemeResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var themeName = themeName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackServiceTheme(stackName, stackVersion, serviceName, themeName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServiceThemeExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var themeName = themeName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to ThemeInfo/*)

            try
            {
                // Get theme details for a stack service
                ThemeResponse result = apiInstance.stacksServiceGetStackServiceTheme(stackName, stackVersion, serviceName, themeName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackServiceTheme: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$themeName = themeName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackServiceTheme($stackName, $stackVersion, $serviceName, $themeName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackServiceTheme: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $themeName = themeName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackServiceTheme(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, themeName => $themeName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackServiceTheme: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
themeName = themeName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to ThemeInfo/*)

try: 
    # Get theme details for a stack service
    api_response = api_instance.stacksServiceGetStackServiceTheme(stackName, stackVersion, serviceName, themeName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackServiceTheme: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceTheme_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceTheme_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceTheme_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceTheme_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceTheme_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceTheme_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">themeName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "themeName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceTheme_themeName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceTheme_themeName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "ThemeInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceTheme_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceTheme_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackServiceTheme-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackServiceTheme-200-schema">
                                  <div id='responses-stacksServiceGetStackServiceTheme-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ThemeResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackServiceTheme-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackServiceTheme-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackServiceTheme-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackServiceThemes">
                      <article id="api-Stacks-stacksServiceGetStackServiceThemes-0" data-group="User" data-name="stacksServiceGetStackServiceThemes" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackServiceThemes</h1>
                          <p>Get all themes for a stack service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all stack themes</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/themes</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/themes?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service artifacts (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ThemeResponse] result = apiInstance.stacksServiceGetStackServiceThemes(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceThemes");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service artifacts (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ThemeResponse] result = apiInstance.stacksServiceGetStackServiceThemes(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceThemes");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to ThemeInfo/file_name,ThemeInfo/service_name,ThemeInfo/stack_name,ThemeInfo/stack_version)
String *sortBy = sortBy_example; // Sort service artifacts (asc | desc) (optional) (default to ThemeInfo/file_name.asc,ThemeInfo/service_name.asc,ThemeInfo/stack_name.asc,ThemeInfo/stack_version.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all themes for a stack service
[apiInstance stacksServiceGetStackServiceThemesWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ThemeResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort service artifacts (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackServiceThemes(stackName, stackVersion, serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServiceThemesExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to ThemeInfo/file_name,ThemeInfo/service_name,ThemeInfo/stack_name,ThemeInfo/stack_version)
            var sortBy = sortBy_example;  // String | Sort service artifacts (asc | desc) (optional)  (default to ThemeInfo/file_name.asc,ThemeInfo/service_name.asc,ThemeInfo/stack_name.asc,ThemeInfo/stack_version.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all themes for a stack service
                array[ThemeResponse] result = apiInstance.stacksServiceGetStackServiceThemes(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackServiceThemes: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort service artifacts (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackServiceThemes($stackName, $stackVersion, $serviceName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackServiceThemes: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort service artifacts (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackServiceThemes(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackServiceThemes: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to ThemeInfo/file_name,ThemeInfo/service_name,ThemeInfo/stack_name,ThemeInfo/stack_version)
sortBy = sortBy_example # String | Sort service artifacts (asc | desc) (optional) (default to ThemeInfo/file_name.asc,ThemeInfo/service_name.asc,ThemeInfo/stack_name.asc,ThemeInfo/stack_version.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all themes for a stack service
    api_response = api_instance.stacksServiceGetStackServiceThemes(stackName, stackVersion, serviceName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackServiceThemes: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "ThemeInfo/file_name,ThemeInfo/service_name,ThemeInfo/stack_name,ThemeInfo/stack_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort service artifacts (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "ThemeInfo/file_name.asc,ThemeInfo/service_name.asc,ThemeInfo/stack_name.asc,ThemeInfo/stack_version.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackServiceThemes-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackServiceThemes-200-schema">
                                  <div id='responses-stacksServiceGetStackServiceThemes-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ThemeResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackServiceThemes-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackServiceThemes-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackServiceThemes-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackServices">
                      <article id="api-Stacks-stacksServiceGetStackServices-0" data-group="User" data-name="stacksServiceGetStackServices" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackServices</h1>
                          <p>Get all services for a stack version</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all services for a stack version.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort stack services (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackServiceResponseSwagger] result = apiInstance.stacksServiceGetStackServices(stackName, stackVersion, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort stack services (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackServiceResponseSwagger] result = apiInstance.stacksServiceGetStackServices(stackName, stackVersion, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackServices/stack_name,StackServices/stack_version,StackServices/service_name)
String *sortBy = sortBy_example; // Sort stack services (asc | desc) (optional) (default to StackServices/stack_name.asc,StackServices/stack_version.asc,StackServices/service_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all services for a stack version
[apiInstance stacksServiceGetStackServicesWith:stackName
    stackVersion:stackVersion
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackServiceResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort stack services (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackServices(stackName, stackVersion, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServicesExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackServices/stack_name,StackServices/stack_version,StackServices/service_name)
            var sortBy = sortBy_example;  // String | Sort stack services (asc | desc) (optional)  (default to StackServices/stack_name.asc,StackServices/stack_version.asc,StackServices/service_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all services for a stack version
                array[StackServiceResponseSwagger] result = apiInstance.stacksServiceGetStackServices(stackName, stackVersion, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort stack services (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackServices($stackName, $stackVersion, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort stack services (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackServices(stackName => $stackName, stackVersion => $stackVersion, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackServices/stack_name,StackServices/stack_version,StackServices/service_name)
sortBy = sortBy_example # String | Sort stack services (asc | desc) (optional) (default to StackServices/stack_name.asc,StackServices/stack_version.asc,StackServices/service_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all services for a stack version
    api_response = api_instance.stacksServiceGetStackServices(stackName, stackVersion, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServices_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServices_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServices_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServices_stackVersion"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackServices/stack_name,StackServices/stack_version,StackServices/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServices_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServices_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort stack services (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "StackServices/stack_name.asc,StackServices/stack_version.asc,StackServices/service_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServices_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServices_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServices_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServices_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServices_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServices_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServices_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServices_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackServices-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackServices-200-schema">
                                  <div id='responses-stacksServiceGetStackServices-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackServiceResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackServices-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackServices-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackServices-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackVersion">
                      <article id="api-Stacks-stacksServiceGetStackVersion-0" data-group="User" data-name="stacksServiceGetStackVersion" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackVersion</h1>
                          <p>Get details for a stack version</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the details for a stack version.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackVersion-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackVersion-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter stack version details
        try {
            StackVersionResponseSwagger result = apiInstance.stacksServiceGetStackVersion(stackName, stackVersion, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackVersion");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter stack version details
        try {
            StackVersionResponseSwagger result = apiInstance.stacksServiceGetStackVersion(stackName, stackVersion, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackVersion");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *fields = fields_example; // Filter stack version details (optional) (default to Versions/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get details for a stack version
[apiInstance stacksServiceGetStackVersionWith:stackName
    stackVersion:stackVersion
    fields:fields
              completionHandler: ^(StackVersionResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter stack version details
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackVersion(stackName, stackVersion, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackVersionExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var fields = fields_example;  // String | Filter stack version details (optional)  (default to Versions/*)

            try
            {
                // Get details for a stack version
                StackVersionResponseSwagger result = apiInstance.stacksServiceGetStackVersion(stackName, stackVersion, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackVersion: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$fields = fields_example; // String | Filter stack version details

try {
    $result = $api_instance->stacksServiceGetStackVersion($stackName, $stackVersion, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackVersion: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $fields = fields_example; # String | Filter stack version details

eval { 
    my $result = $api_instance->stacksServiceGetStackVersion(stackName => $stackName, stackVersion => $stackVersion, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackVersion: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
fields = fields_example # String | Filter stack version details (optional) (default to Versions/*)

try: 
    # Get details for a stack version
    api_response = api_instance.stacksServiceGetStackVersion(stackName, stackVersion, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackVersion: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersion_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersion_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersion_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersion_stackVersion"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter stack version details",
  "required" : false,
  "type" : "string",
  "default" : "Versions/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersion_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersion_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackVersion-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackVersion-200-schema">
                                  <div id='responses-stacksServiceGetStackVersion-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/StackVersionResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackVersion-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackVersion-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackVersion-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackVersionLinks">
                      <article id="api-Stacks-stacksServiceGetStackVersionLinks-0" data-group="User" data-name="stacksServiceGetStackVersionLinks" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackVersionLinks</h1>
                          <p>Get extension links for a stack version</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the extension links for a stack version.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/links</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/links?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter extension link attributes
        String sortBy = sortBy_example; // String | Sort extension links (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ExtensionLinkResponse] result = apiInstance.stacksServiceGetStackVersionLinks(stackName, stackVersion, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackVersionLinks");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter extension link attributes
        String sortBy = sortBy_example; // String | Sort extension links (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ExtensionLinkResponse] result = apiInstance.stacksServiceGetStackVersionLinks(stackName, stackVersion, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackVersionLinks");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *fields = fields_example; // Filter extension link attributes (optional) (default to ExtensionLink/link_id,ExtensionLink/stack_name,ExtensionLink/stack_version,ExtensionLink/extension_name,ExtensionLink/extension_version)
String *sortBy = sortBy_example; // Sort extension links (asc | desc) (optional) (default to ExtensionLink/link_id.asc,ExtensionLink/stack_name.asc,ExtensionLink/stack_version.asc,ExtensionLink/extension_name.asc,ExtensionLink/extension_version.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get extension links for a stack version
[apiInstance stacksServiceGetStackVersionLinksWith:stackName
    stackVersion:stackVersion
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ExtensionLinkResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter extension link attributes
  'sortBy': sortBy_example, // {String} Sort extension links (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackVersionLinks(stackName, stackVersion, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackVersionLinksExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var fields = fields_example;  // String | Filter extension link attributes (optional)  (default to ExtensionLink/link_id,ExtensionLink/stack_name,ExtensionLink/stack_version,ExtensionLink/extension_name,ExtensionLink/extension_version)
            var sortBy = sortBy_example;  // String | Sort extension links (asc | desc) (optional)  (default to ExtensionLink/link_id.asc,ExtensionLink/stack_name.asc,ExtensionLink/stack_version.asc,ExtensionLink/extension_name.asc,ExtensionLink/extension_version.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get extension links for a stack version
                array[ExtensionLinkResponse] result = apiInstance.stacksServiceGetStackVersionLinks(stackName, stackVersion, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackVersionLinks: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$fields = fields_example; // String | Filter extension link attributes
$sortBy = sortBy_example; // String | Sort extension links (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackVersionLinks($stackName, $stackVersion, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackVersionLinks: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $fields = fields_example; # String | Filter extension link attributes
my $sortBy = sortBy_example; # String | Sort extension links (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackVersionLinks(stackName => $stackName, stackVersion => $stackVersion, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackVersionLinks: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
fields = fields_example # String | Filter extension link attributes (optional) (default to ExtensionLink/link_id,ExtensionLink/stack_name,ExtensionLink/stack_version,ExtensionLink/extension_name,ExtensionLink/extension_version)
sortBy = sortBy_example # String | Sort extension links (asc | desc) (optional) (default to ExtensionLink/link_id.asc,ExtensionLink/stack_name.asc,ExtensionLink/stack_version.asc,ExtensionLink/extension_name.asc,ExtensionLink/extension_version.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get extension links for a stack version
    api_response = api_instance.stacksServiceGetStackVersionLinks(stackName, stackVersion, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackVersionLinks: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersionLinks_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersionLinks_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersionLinks_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersionLinks_stackVersion"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter extension link attributes",
  "required" : false,
  "type" : "string",
  "default" : "ExtensionLink/link_id,ExtensionLink/stack_name,ExtensionLink/stack_version,ExtensionLink/extension_name,ExtensionLink/extension_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersionLinks_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersionLinks_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort extension links (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "ExtensionLink/link_id.asc,ExtensionLink/stack_name.asc,ExtensionLink/stack_version.asc,ExtensionLink/extension_name.asc,ExtensionLink/extension_version.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersionLinks_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersionLinks_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersionLinks_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersionLinks_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersionLinks_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersionLinks_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersionLinks_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersionLinks_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackVersionLinks-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackVersionLinks-200-schema">
                                  <div id='responses-stacksServiceGetStackVersionLinks-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ExtensionLinkResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackVersionLinks-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackVersionLinks-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackVersionLinks-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackVersions">
                      <article id="api-Stacks-stacksServiceGetStackVersions-0" data-group="User" data-name="stacksServiceGetStackVersions" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackVersions</h1>
                          <p>Get all versions for a stacks</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all versions for a stack.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackVersions-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackVersions-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String fields = fields_example; // String | Filter stack version details
        String sortBy = sortBy_example; // String | Sort stack privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackVersionResponseSwagger] result = apiInstance.stacksServiceGetStackVersions(stackName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackVersions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String fields = fields_example; // String | Filter stack version details
        String sortBy = sortBy_example; // String | Sort stack privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackVersionResponseSwagger] result = apiInstance.stacksServiceGetStackVersions(stackName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackVersions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *fields = fields_example; // Filter stack version details (optional) (default to Versions/stack_name,Versions/stack_version)
String *sortBy = sortBy_example; // Sort stack privileges (asc | desc) (optional) (default to Versions/stack_name.asc,Versions/stack_version.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all versions for a stacks
[apiInstance stacksServiceGetStackVersionsWith:stackName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackVersionResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter stack version details
  'sortBy': sortBy_example, // {String} Sort stack privileges (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackVersions(stackName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackVersionsExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var fields = fields_example;  // String | Filter stack version details (optional)  (default to Versions/stack_name,Versions/stack_version)
            var sortBy = sortBy_example;  // String | Sort stack privileges (asc | desc) (optional)  (default to Versions/stack_name.asc,Versions/stack_version.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all versions for a stacks
                array[StackVersionResponseSwagger] result = apiInstance.stacksServiceGetStackVersions(stackName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackVersions: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$fields = fields_example; // String | Filter stack version details
$sortBy = sortBy_example; // String | Sort stack privileges (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackVersions($stackName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackVersions: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $fields = fields_example; # String | Filter stack version details
my $sortBy = sortBy_example; # String | Sort stack privileges (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackVersions(stackName => $stackName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackVersions: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
fields = fields_example # String | Filter stack version details (optional) (default to Versions/stack_name,Versions/stack_version)
sortBy = sortBy_example # String | Sort stack privileges (asc | desc) (optional) (default to Versions/stack_name.asc,Versions/stack_version.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all versions for a stacks
    api_response = api_instance.stacksServiceGetStackVersions(stackName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackVersions: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersions_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersions_stackName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter stack version details",
  "required" : false,
  "type" : "string",
  "default" : "Versions/stack_name,Versions/stack_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersions_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersions_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort stack privileges (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Versions/stack_name.asc,Versions/stack_version.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersions_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersions_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersions_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersions_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersions_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersions_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersions_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersions_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackVersions-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackVersions-200-schema">
                                  <div id='responses-stacksServiceGetStackVersions-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackVersionResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackVersions-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackVersions-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackVersions-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStacks">
                      <article id="api-Stacks-stacksServiceGetStacks-0" data-group="User" data-name="stacksServiceGetStacks" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStacks</h1>
                          <p>Get all stacks</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all stacks.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStacks-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStacks-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String fields = fields_example; // String | Filter stack details
        String sortBy = sortBy_example; // String | Sort stack privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackResponseSwagger] result = apiInstance.stacksServiceGetStacks(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStacks");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String fields = fields_example; // String | Filter stack details
        String sortBy = sortBy_example; // String | Sort stack privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackResponseSwagger] result = apiInstance.stacksServiceGetStacks(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStacks");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter stack details (optional) (default to Stacks/stack_name)
String *sortBy = sortBy_example; // Sort stack privileges (asc | desc) (optional) (default to Stacks/stack_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all stacks
[apiInstance stacksServiceGetStacksWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var opts = { 
  'fields': fields_example, // {String} Filter stack details
  'sortBy': sortBy_example, // {String} Sort stack privileges (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStacks(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStacksExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var fields = fields_example;  // String | Filter stack details (optional)  (default to Stacks/stack_name)
            var sortBy = sortBy_example;  // String | Sort stack privileges (asc | desc) (optional)  (default to Stacks/stack_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all stacks
                array[StackResponseSwagger] result = apiInstance.stacksServiceGetStacks(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStacks: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$fields = fields_example; // String | Filter stack details
$sortBy = sortBy_example; // String | Sort stack privileges (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStacks($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStacks: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $fields = fields_example; # String | Filter stack details
my $sortBy = sortBy_example; # String | Sort stack privileges (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStacks(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStacks: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
fields = fields_example # String | Filter stack details (optional) (default to Stacks/stack_name)
sortBy = sortBy_example # String | Sort stack privileges (asc | desc) (optional) (default to Stacks/stack_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all stacks
    api_response = api_instance.stacksServiceGetStacks(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStacks: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter stack details",
  "required" : false,
  "type" : "string",
  "default" : "Stacks/stack_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStacks_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStacks_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort stack privileges (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Stacks/stack_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStacks_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStacks_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStacks_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStacks_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStacks_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStacks_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStacks_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStacks_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStacks-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStacks-200-schema">
                                  <div id='responses-stacksServiceGetStacks-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStacks-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStacks-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStacks-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-UserAuthenticationSources">
                  <h1>UserAuthenticationSources</h1>
                    <div id="api-UserAuthenticationSources-createAuthenticationSources">
                      <article id="api-UserAuthenticationSources-createAuthenticationSources-0" data-group="User" data-name="createAuthenticationSources" data-version="0">
                        <div class="pull-left">
                          <h1>createAuthenticationSources</h1>
                          <p>Create one or more new authentication sources for a user</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/users/{userName}/sources</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-java">Java</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-php">PHP</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-UserAuthenticationSources-createAuthenticationSources-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/users/{userName}/sources"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UserAuthenticationSourcesApi;

import java.io.File;
import java.util.*;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        UserAuthenticationSourceRequestCreateSwagger body = ; // UserAuthenticationSourceRequestCreateSwagger | 
        try {
            apiInstance.createAuthenticationSources(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#createAuthenticationSources");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UserAuthenticationSourcesApi;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        UserAuthenticationSourceRequestCreateSwagger body = ; // UserAuthenticationSourceRequestCreateSwagger | 
        try {
            apiInstance.createAuthenticationSources(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#createAuthenticationSources");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
UserAuthenticationSourceRequestCreateSwagger *body = ; //  (optional)

UserAuthenticationSourcesApi *apiInstance = [[UserAuthenticationSourcesApi alloc] init];

// Create one or more new authentication sources for a user
[apiInstance createAuthenticationSourcesWith:userName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UserAuthenticationSourcesApi()

var userName = userName_example; // {String} user name

var opts = { 
  'body':  // {UserAuthenticationSourceRequestCreateSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createAuthenticationSources(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createAuthenticationSourcesExample
    {
        public void main()
        {
            
            var apiInstance = new UserAuthenticationSourcesApi();
            var userName = userName_example;  // String | user name
            var body = new UserAuthenticationSourceRequestCreateSwagger(); // UserAuthenticationSourceRequestCreateSwagger |  (optional) 

            try
            {
                // Create one or more new authentication sources for a user
                apiInstance.createAuthenticationSources(userName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UserAuthenticationSourcesApi.createAuthenticationSources: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UserAuthenticationSourcesApi();
$userName = userName_example; // String | user name
$body = ; // UserAuthenticationSourceRequestCreateSwagger | 

try {
    $api_instance->createAuthenticationSources($userName, $body);
} catch (Exception $e) {
    echo 'Exception when calling UserAuthenticationSourcesApi->createAuthenticationSources: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UserAuthenticationSourcesApi;

my $api_instance = WWW::SwaggerClient::UserAuthenticationSourcesApi->new();
my $userName = userName_example; # String | user name
my $body = WWW::SwaggerClient::Object::UserAuthenticationSourceRequestCreateSwagger->new(); # UserAuthenticationSourceRequestCreateSwagger | 

eval { 
    $api_instance->createAuthenticationSources(userName => $userName, body => $body);
};
if ($@) {
    warn "Exception when calling UserAuthenticationSourcesApi->createAuthenticationSources: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UserAuthenticationSourcesApi()
userName = userName_example # String | user name
body =  # UserAuthenticationSourceRequestCreateSwagger |  (optional)

try: 
    # Create one or more new authentication sources for a user
    api_instance.createAuthenticationSources(userName, body=body)
except ApiException as e:
    print("Exception when calling UserAuthenticationSourcesApi->createAuthenticationSources: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createAuthenticationSources_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createAuthenticationSources_userName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/UserAuthenticationSourceRequestCreateSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createAuthenticationSources_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createAuthenticationSources_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-UserAuthenticationSources-deleteAuthenticationSource">
                      <article id="api-UserAuthenticationSources-deleteAuthenticationSource-0" data-group="User" data-name="deleteAuthenticationSource" data-version="0">
                        <div class="pull-left">
                          <h1>deleteAuthenticationSource</h1>
                          <p>Deletes an existing authentication source</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/users/{userName}/sources/{sourceId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-java">Java</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-php">PHP</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/users/{userName}/sources/{sourceId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UserAuthenticationSourcesApi;

import java.io.File;
import java.util.*;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String sourceId = sourceId_example; // String | source id
        try {
            apiInstance.deleteAuthenticationSource(userName, sourceId);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#deleteAuthenticationSource");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UserAuthenticationSourcesApi;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String sourceId = sourceId_example; // String | source id
        try {
            apiInstance.deleteAuthenticationSource(userName, sourceId);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#deleteAuthenticationSource");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *sourceId = sourceId_example; // source id

UserAuthenticationSourcesApi *apiInstance = [[UserAuthenticationSourcesApi alloc] init];

// Deletes an existing authentication source
[apiInstance deleteAuthenticationSourceWith:userName
    sourceId:sourceId
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UserAuthenticationSourcesApi()

var userName = userName_example; // {String} user name

var sourceId = sourceId_example; // {String} source id


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteAuthenticationSource(userName, sourceId, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteAuthenticationSourceExample
    {
        public void main()
        {
            
            var apiInstance = new UserAuthenticationSourcesApi();
            var userName = userName_example;  // String | user name
            var sourceId = sourceId_example;  // String | source id

            try
            {
                // Deletes an existing authentication source
                apiInstance.deleteAuthenticationSource(userName, sourceId);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UserAuthenticationSourcesApi.deleteAuthenticationSource: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UserAuthenticationSourcesApi();
$userName = userName_example; // String | user name
$sourceId = sourceId_example; // String | source id

try {
    $api_instance->deleteAuthenticationSource($userName, $sourceId);
} catch (Exception $e) {
    echo 'Exception when calling UserAuthenticationSourcesApi->deleteAuthenticationSource: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UserAuthenticationSourcesApi;

my $api_instance = WWW::SwaggerClient::UserAuthenticationSourcesApi->new();
my $userName = userName_example; # String | user name
my $sourceId = sourceId_example; # String | source id

eval { 
    $api_instance->deleteAuthenticationSource(userName => $userName, sourceId => $sourceId);
};
if ($@) {
    warn "Exception when calling UserAuthenticationSourcesApi->deleteAuthenticationSource: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UserAuthenticationSourcesApi()
userName = userName_example # String | user name
sourceId = sourceId_example # String | source id

try: 
    # Deletes an existing authentication source
    api_instance.deleteAuthenticationSource(userName, sourceId)
except ApiException as e:
    print("Exception when calling UserAuthenticationSourcesApi->deleteAuthenticationSource: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteAuthenticationSource_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteAuthenticationSource_userName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">sourceId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sourceId",
  "in" : "path",
  "description" : "source id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteAuthenticationSource_sourceId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteAuthenticationSource_sourceId"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-UserAuthenticationSources-getAuthenticationSource">
                      <article id="api-UserAuthenticationSources-getAuthenticationSource-0" data-group="User" data-name="getAuthenticationSource" data-version="0">
                        <div class="pull-left">
                          <h1>getAuthenticationSource</h1>
                          <p>Get user authentication source</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}/sources/{sourceId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-java">Java</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-php">PHP</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-UserAuthenticationSources-getAuthenticationSource-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}/sources/{sourceId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UserAuthenticationSourcesApi;

import java.io.File;
import java.util.*;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String sourceId = sourceId_example; // String | source id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            UserAuthenticationSourceResponseSwagger result = apiInstance.getAuthenticationSource(userName, sourceId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#getAuthenticationSource");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UserAuthenticationSourcesApi;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String sourceId = sourceId_example; // String | source id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            UserAuthenticationSourceResponseSwagger result = apiInstance.getAuthenticationSource(userName, sourceId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#getAuthenticationSource");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *sourceId = sourceId_example; // source id
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to AuthenticationSourceInfo/*)

UserAuthenticationSourcesApi *apiInstance = [[UserAuthenticationSourcesApi alloc] init];

// Get user authentication source
[apiInstance getAuthenticationSourceWith:userName
    sourceId:sourceId
    fields:fields
              completionHandler: ^(UserAuthenticationSourceResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UserAuthenticationSourcesApi()

var userName = userName_example; // {String} user name

var sourceId = sourceId_example; // {String} source id

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getAuthenticationSource(userName, sourceId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getAuthenticationSourceExample
    {
        public void main()
        {
            
            var apiInstance = new UserAuthenticationSourcesApi();
            var userName = userName_example;  // String | user name
            var sourceId = sourceId_example;  // String | source id
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to AuthenticationSourceInfo/*)

            try
            {
                // Get user authentication source
                UserAuthenticationSourceResponseSwagger result = apiInstance.getAuthenticationSource(userName, sourceId, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UserAuthenticationSourcesApi.getAuthenticationSource: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UserAuthenticationSourcesApi();
$userName = userName_example; // String | user name
$sourceId = sourceId_example; // String | source id
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getAuthenticationSource($userName, $sourceId, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UserAuthenticationSourcesApi->getAuthenticationSource: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UserAuthenticationSourcesApi;

my $api_instance = WWW::SwaggerClient::UserAuthenticationSourcesApi->new();
my $userName = userName_example; # String | user name
my $sourceId = sourceId_example; # String | source id
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getAuthenticationSource(userName => $userName, sourceId => $sourceId, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UserAuthenticationSourcesApi->getAuthenticationSource: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UserAuthenticationSourcesApi()
userName = userName_example # String | user name
sourceId = sourceId_example # String | source id
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to AuthenticationSourceInfo/*)

try: 
    # Get user authentication source
    api_response = api_instance.getAuthenticationSource(userName, sourceId, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UserAuthenticationSourcesApi->getAuthenticationSource: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSource_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSource_userName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">sourceId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sourceId",
  "in" : "path",
  "description" : "source id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSource_sourceId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSource_sourceId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "AuthenticationSourceInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSource_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSource_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getAuthenticationSource-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getAuthenticationSource-200-schema">
                                  <div id='responses-getAuthenticationSource-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/UserAuthenticationSourceResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getAuthenticationSource-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getAuthenticationSource-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getAuthenticationSource-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-UserAuthenticationSources-getAuthenticationSources">
                      <article id="api-UserAuthenticationSources-getAuthenticationSources-0" data-group="User" data-name="getAuthenticationSources" data-version="0">
                        <div class="pull-left">
                          <h1>getAuthenticationSources</h1>
                          <p>Get all authentication sources</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}/sources</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-java">Java</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-php">PHP</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-UserAuthenticationSources-getAuthenticationSources-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}/sources?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UserAuthenticationSourcesApi;

import java.io.File;
import java.util.*;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[UserAuthenticationSourceResponseSwagger] result = apiInstance.getAuthenticationSources(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#getAuthenticationSources");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UserAuthenticationSourcesApi;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[UserAuthenticationSourceResponseSwagger] result = apiInstance.getAuthenticationSources(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#getAuthenticationSources");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to AuthenticationSourceInfo/source_id,AuthenticationSourceInfo/user_name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to AuthenticationSourceInfo/source_id.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

UserAuthenticationSourcesApi *apiInstance = [[UserAuthenticationSourcesApi alloc] init];

// Get all authentication sources
[apiInstance getAuthenticationSourcesWith:userName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[UserAuthenticationSourceResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UserAuthenticationSourcesApi()

var userName = userName_example; // {String} user name

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getAuthenticationSources(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getAuthenticationSourcesExample
    {
        public void main()
        {
            
            var apiInstance = new UserAuthenticationSourcesApi();
            var userName = userName_example;  // String | user name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to AuthenticationSourceInfo/source_id,AuthenticationSourceInfo/user_name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to AuthenticationSourceInfo/source_id.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all authentication sources
                array[UserAuthenticationSourceResponseSwagger] result = apiInstance.getAuthenticationSources(userName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UserAuthenticationSourcesApi.getAuthenticationSources: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UserAuthenticationSourcesApi();
$userName = userName_example; // String | user name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getAuthenticationSources($userName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UserAuthenticationSourcesApi->getAuthenticationSources: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UserAuthenticationSourcesApi;

my $api_instance = WWW::SwaggerClient::UserAuthenticationSourcesApi->new();
my $userName = userName_example; # String | user name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getAuthenticationSources(userName => $userName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UserAuthenticationSourcesApi->getAuthenticationSources: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UserAuthenticationSourcesApi()
userName = userName_example # String | user name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to AuthenticationSourceInfo/source_id,AuthenticationSourceInfo/user_name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to AuthenticationSourceInfo/source_id.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all authentication sources
    api_response = api_instance.getAuthenticationSources(userName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UserAuthenticationSourcesApi->getAuthenticationSources: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSources_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSources_userName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "AuthenticationSourceInfo/source_id,AuthenticationSourceInfo/user_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSources_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSources_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "AuthenticationSourceInfo/source_id.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSources_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSources_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSources_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSources_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSources_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSources_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSources_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSources_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getAuthenticationSources-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getAuthenticationSources-200-schema">
                                  <div id='responses-getAuthenticationSources-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/UserAuthenticationSourceResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getAuthenticationSources-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getAuthenticationSources-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getAuthenticationSources-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-UserAuthenticationSources-updateAuthenticationSource">
                      <article id="api-UserAuthenticationSources-updateAuthenticationSource-0" data-group="User" data-name="updateAuthenticationSource" data-version="0">
                        <div class="pull-left">
                          <h1>updateAuthenticationSource</h1>
                          <p>Updates an existing authentication source</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/users/{userName}/sources/{sourceId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-java">Java</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-php">PHP</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/users/{userName}/sources/{sourceId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UserAuthenticationSourcesApi;

import java.io.File;
import java.util.*;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String sourceId = sourceId_example; // String | source id
        UserAuthenticationSourceRequestUpdateSwagger body = ; // UserAuthenticationSourceRequestUpdateSwagger | 
        try {
            apiInstance.updateAuthenticationSource(userName, sourceId, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#updateAuthenticationSource");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UserAuthenticationSourcesApi;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String sourceId = sourceId_example; // String | source id
        UserAuthenticationSourceRequestUpdateSwagger body = ; // UserAuthenticationSourceRequestUpdateSwagger | 
        try {
            apiInstance.updateAuthenticationSource(userName, sourceId, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#updateAuthenticationSource");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *sourceId = sourceId_example; // source id
UserAuthenticationSourceRequestUpdateSwagger *body = ; //  (optional)

UserAuthenticationSourcesApi *apiInstance = [[UserAuthenticationSourcesApi alloc] init];

// Updates an existing authentication source
[apiInstance updateAuthenticationSourceWith:userName
    sourceId:sourceId
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UserAuthenticationSourcesApi()

var userName = userName_example; // {String} user name

var sourceId = sourceId_example; // {String} source id

var opts = { 
  'body':  // {UserAuthenticationSourceRequestUpdateSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateAuthenticationSource(userName, sourceId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateAuthenticationSourceExample
    {
        public void main()
        {
            
            var apiInstance = new UserAuthenticationSourcesApi();
            var userName = userName_example;  // String | user name
            var sourceId = sourceId_example;  // String | source id
            var body = new UserAuthenticationSourceRequestUpdateSwagger(); // UserAuthenticationSourceRequestUpdateSwagger |  (optional) 

            try
            {
                // Updates an existing authentication source
                apiInstance.updateAuthenticationSource(userName, sourceId, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UserAuthenticationSourcesApi.updateAuthenticationSource: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UserAuthenticationSourcesApi();
$userName = userName_example; // String | user name
$sourceId = sourceId_example; // String | source id
$body = ; // UserAuthenticationSourceRequestUpdateSwagger | 

try {
    $api_instance->updateAuthenticationSource($userName, $sourceId, $body);
} catch (Exception $e) {
    echo 'Exception when calling UserAuthenticationSourcesApi->updateAuthenticationSource: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UserAuthenticationSourcesApi;

my $api_instance = WWW::SwaggerClient::UserAuthenticationSourcesApi->new();
my $userName = userName_example; # String | user name
my $sourceId = sourceId_example; # String | source id
my $body = WWW::SwaggerClient::Object::UserAuthenticationSourceRequestUpdateSwagger->new(); # UserAuthenticationSourceRequestUpdateSwagger | 

eval { 
    $api_instance->updateAuthenticationSource(userName => $userName, sourceId => $sourceId, body => $body);
};
if ($@) {
    warn "Exception when calling UserAuthenticationSourcesApi->updateAuthenticationSource: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UserAuthenticationSourcesApi()
userName = userName_example # String | user name
sourceId = sourceId_example # String | source id
body =  # UserAuthenticationSourceRequestUpdateSwagger |  (optional)

try: 
    # Updates an existing authentication source
    api_instance.updateAuthenticationSource(userName, sourceId, body=body)
except ApiException as e:
    print("Exception when calling UserAuthenticationSourcesApi->updateAuthenticationSource: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateAuthenticationSource_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateAuthenticationSource_userName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">sourceId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sourceId",
  "in" : "path",
  "description" : "source id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateAuthenticationSource_sourceId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateAuthenticationSource_sourceId"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/UserAuthenticationSourceRequestUpdateSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateAuthenticationSource_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateAuthenticationSource_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Users">
                  <h1>Users</h1>
                    <div id="api-Users-activeWidgetLayoutServiceGetServices">
                      <article id="api-Users-activeWidgetLayoutServiceGetServices-0" data-group="User" data-name="activeWidgetLayoutServiceGetServices" data-version="0">
                        <div class="pull-left">
                          <h1>activeWidgetLayoutServiceGetServices</h1>
                          <p>Get user widget layouts</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all active widget layouts for user.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}/activeWidgetLayouts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-activeWidgetLayoutServiceGetServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}/activeWidgetLayouts?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter user layout details
        String sortBy = sortBy_example; // String | Sort layouts (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[ActiveWidgetLayoutResponse] result = apiInstance.activeWidgetLayoutServiceGetServices(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#activeWidgetLayoutServiceGetServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter user layout details
        String sortBy = sortBy_example; // String | Sort layouts (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[ActiveWidgetLayoutResponse] result = apiInstance.activeWidgetLayoutServiceGetServices(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#activeWidgetLayoutServiceGetServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *fields = fields_example; // Filter user layout details (optional) (default to WidgetLayoutInfo/*)
String *sortBy = sortBy_example; // Sort layouts (asc | desc) (optional) (default to WidgetLayoutInfo/user_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive). Valid values are :offset | "end" (optional)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Get user widget layouts
[apiInstance activeWidgetLayoutServiceGetServicesWith:userName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ActiveWidgetLayoutResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var opts = { 
  'fields': fields_example, // {String} Filter user layout details
  'sortBy': sortBy_example, // {String} Sort layouts (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive). Valid values are :offset | "start"
  'to': to_example // {String} The ending page resource (inclusive). Valid values are :offset | "end"
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.activeWidgetLayoutServiceGetServices(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class activeWidgetLayoutServiceGetServicesExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var fields = fields_example;  // String | Filter user layout details (optional)  (default to WidgetLayoutInfo/*)
            var sortBy = sortBy_example;  // String | Sort layouts (asc | desc) (optional)  (default to WidgetLayoutInfo/user_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive). Valid values are :offset | "start" (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive). Valid values are :offset | "end" (optional) 

            try
            {
                // Get user widget layouts
                array[ActiveWidgetLayoutResponse] result = apiInstance.activeWidgetLayoutServiceGetServices(userName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.activeWidgetLayoutServiceGetServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$fields = fields_example; // String | Filter user layout details
$sortBy = sortBy_example; // String | Sort layouts (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
$to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"

try {
    $result = $api_instance->activeWidgetLayoutServiceGetServices($userName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->activeWidgetLayoutServiceGetServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $fields = fields_example; # String | Filter user layout details
my $sortBy = sortBy_example; # String | Sort layouts (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive). Valid values are :offset | "start"
my $to = to_example; # String | The ending page resource (inclusive). Valid values are :offset | "end"

eval { 
    my $result = $api_instance->activeWidgetLayoutServiceGetServices(userName => $userName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UsersApi->activeWidgetLayoutServiceGetServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
fields = fields_example # String | Filter user layout details (optional) (default to WidgetLayoutInfo/*)
sortBy = sortBy_example # String | Sort layouts (asc | desc) (optional) (default to WidgetLayoutInfo/user_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive). Valid values are :offset | "end" (optional)

try: 
    # Get user widget layouts
    api_response = api_instance.activeWidgetLayoutServiceGetServices(userName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UsersApi->activeWidgetLayoutServiceGetServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_activeWidgetLayoutServiceGetServices_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceGetServices_userName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter user layout details",
  "required" : false,
  "type" : "string",
  "default" : "WidgetLayoutInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_activeWidgetLayoutServiceGetServices_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceGetServices_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort layouts (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "WidgetLayoutInfo/user_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_activeWidgetLayoutServiceGetServices_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceGetServices_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_activeWidgetLayoutServiceGetServices_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceGetServices_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive). Valid values are :offset | \"start\"",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_activeWidgetLayoutServiceGetServices_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceGetServices_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive). Valid values are :offset | \"end\"",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_activeWidgetLayoutServiceGetServices_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceGetServices_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-activeWidgetLayoutServiceGetServices-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-activeWidgetLayoutServiceGetServices-200-schema">
                                  <div id='responses-activeWidgetLayoutServiceGetServices-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ActiveWidgetLayoutResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-activeWidgetLayoutServiceGetServices-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-activeWidgetLayoutServiceGetServices-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-activeWidgetLayoutServiceGetServices-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-activeWidgetLayoutServiceUpdateServices">
                      <article id="api-Users-activeWidgetLayoutServiceUpdateServices-0" data-group="User" data-name="activeWidgetLayoutServiceUpdateServices" data-version="0">
                        <div class="pull-left">
                          <h1>activeWidgetLayoutServiceUpdateServices</h1>
                          <p>Update user widget layouts</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Updates user widget layout.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/users/{userName}/activeWidgetLayouts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/users/{userName}/activeWidgetLayouts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        ActiveWidgetLayoutRequest body = ; // ActiveWidgetLayoutRequest | input parameters in json form
        try {
            apiInstance.activeWidgetLayoutServiceUpdateServices(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#activeWidgetLayoutServiceUpdateServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        ActiveWidgetLayoutRequest body = ; // ActiveWidgetLayoutRequest | input parameters in json form
        try {
            apiInstance.activeWidgetLayoutServiceUpdateServices(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#activeWidgetLayoutServiceUpdateServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
ActiveWidgetLayoutRequest *body = ; // input parameters in json form

UsersApi *apiInstance = [[UsersApi alloc] init];

// Update user widget layouts
[apiInstance activeWidgetLayoutServiceUpdateServicesWith:userName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var body = ; // {ActiveWidgetLayoutRequest} input parameters in json form


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.activeWidgetLayoutServiceUpdateServices(userName, body, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class activeWidgetLayoutServiceUpdateServicesExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var body = new ActiveWidgetLayoutRequest(); // ActiveWidgetLayoutRequest | input parameters in json form

            try
            {
                // Update user widget layouts
                apiInstance.activeWidgetLayoutServiceUpdateServices(userName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.activeWidgetLayoutServiceUpdateServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$body = ; // ActiveWidgetLayoutRequest | input parameters in json form

try {
    $api_instance->activeWidgetLayoutServiceUpdateServices($userName, $body);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->activeWidgetLayoutServiceUpdateServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $body = WWW::SwaggerClient::Object::ActiveWidgetLayoutRequest->new(); # ActiveWidgetLayoutRequest | input parameters in json form

eval { 
    $api_instance->activeWidgetLayoutServiceUpdateServices(userName => $userName, body => $body);
};
if ($@) {
    warn "Exception when calling UsersApi->activeWidgetLayoutServiceUpdateServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
body =  # ActiveWidgetLayoutRequest | input parameters in json form

try: 
    # Update user widget layouts
    api_instance.activeWidgetLayoutServiceUpdateServices(userName, body)
except ApiException as e:
    print("Exception when calling UsersApi->activeWidgetLayoutServiceUpdateServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_activeWidgetLayoutServiceUpdateServices_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceUpdateServices_userName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body <span style="color:red;">*</span></td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "description" : "input parameters in json form",
  "required" : true,
  "schema" : {
    "$ref" : "#/definitions/ActiveWidgetLayoutRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_activeWidgetLayoutServiceUpdateServices_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceUpdateServices_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Server Error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-createUser">
                      <article id="api-Users-createUser-0" data-group="User" data-name="createUser" data-version="0">
                        <div class="pull-left">
                          <h1>createUser</h1>
                          <p>Create new user</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/users/{userName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-createUser-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-createUser-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-createUser-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-createUser-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-createUser-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-createUser-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-createUser-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-createUser-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-createUser-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-createUser-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-createUser-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-createUser-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/users/{userName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-createUser-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        UserRequestCreateUserSwagger body = ; // UserRequestCreateUserSwagger | 
        try {
            apiInstance.createUser(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#createUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-createUser-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        UserRequestCreateUserSwagger body = ; // UserRequestCreateUserSwagger | 
        try {
            apiInstance.createUser(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#createUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-createUser-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-createUser-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
UserRequestCreateUserSwagger *body = ; //  (optional)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Create new user
[apiInstance createUserWith:userName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUser-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var opts = { 
  'body':  // {UserRequestCreateUserSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createUser(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-createUser-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-createUser-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createUserExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var body = new UserRequestCreateUserSwagger(); // UserRequestCreateUserSwagger |  (optional) 

            try
            {
                // Create new user
                apiInstance.createUser(userName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.createUser: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUser-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$body = ; // UserRequestCreateUserSwagger | 

try {
    $api_instance->createUser($userName, $body);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->createUser: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUser-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $body = WWW::SwaggerClient::Object::UserRequestCreateUserSwagger->new(); # UserRequestCreateUserSwagger | 

eval { 
    $api_instance->createUser(userName => $userName, body => $body);
};
if ($@) {
    warn "Exception when calling UsersApi->createUser: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUser-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
body =  # UserRequestCreateUserSwagger |  (optional)

try: 
    # Create new user
    api_instance.createUser(userName, body=body)
except ApiException as e:
    print("Exception when calling UsersApi->createUser: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createUser_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createUser_userName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/UserRequestCreateUserSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createUser_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createUser_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-createUsers">
                      <article id="api-Users-createUsers-0" data-group="User" data-name="createUsers" data-version="0">
                        <div class="pull-left">
                          <h1>createUsers</h1>
                          <p>Creates one or more users in a single request</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/users</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-createUsers-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-createUsers-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-createUsers-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-createUsers-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-createUsers-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-createUsers-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-createUsers-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-createUsers-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-createUsers-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-createUsers-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-createUsers-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-createUsers-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/users"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-createUsers-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        UserRequestCreateUsersSwagger body = ; // UserRequestCreateUsersSwagger | 
        try {
            apiInstance.createUsers(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#createUsers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-createUsers-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        UserRequestCreateUsersSwagger body = ; // UserRequestCreateUsersSwagger | 
        try {
            apiInstance.createUsers(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#createUsers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-createUsers-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-createUsers-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">UserRequestCreateUsersSwagger *body = ; //  (optional)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Creates one or more users in a single request
[apiInstance createUsersWith:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUsers-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var opts = { 
  'body':  // {UserRequestCreateUsersSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createUsers(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-createUsers-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-createUsers-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createUsersExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var body = new UserRequestCreateUsersSwagger(); // UserRequestCreateUsersSwagger |  (optional) 

            try
            {
                // Creates one or more users in a single request
                apiInstance.createUsers(body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.createUsers: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUsers-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$body = ; // UserRequestCreateUsersSwagger | 

try {
    $api_instance->createUsers($body);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->createUsers: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUsers-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $body = WWW::SwaggerClient::Object::UserRequestCreateUsersSwagger->new(); # UserRequestCreateUsersSwagger | 

eval { 
    $api_instance->createUsers(body => $body);
};
if ($@) {
    warn "Exception when calling UsersApi->createUsers: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUsers-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
body =  # UserRequestCreateUsersSwagger |  (optional)

try: 
    # Creates one or more users in a single request
    api_instance.createUsers(body=body)
except ApiException as e:
    print("Exception when calling UsersApi->createUsers: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/UserRequestCreateUsersSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createUsers_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createUsers_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-deleteUser">
                      <article id="api-Users-deleteUser-0" data-group="User" data-name="deleteUser" data-version="0">
                        <div class="pull-left">
                          <h1>deleteUser</h1>
                          <p>Delete single user</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/users/{userName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-deleteUser-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-deleteUser-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-deleteUser-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-deleteUser-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-deleteUser-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-deleteUser-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-deleteUser-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-deleteUser-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-deleteUser-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-deleteUser-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-deleteUser-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-deleteUser-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/users/{userName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-deleteUser-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        try {
            apiInstance.deleteUser(userName);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#deleteUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-deleteUser-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        try {
            apiInstance.deleteUser(userName);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#deleteUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-deleteUser-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-deleteUser-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name

UsersApi *apiInstance = [[UsersApi alloc] init];

// Delete single user
[apiInstance deleteUserWith:userName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-deleteUser-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteUser(userName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-deleteUser-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-deleteUser-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteUserExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name

            try
            {
                // Delete single user
                apiInstance.deleteUser(userName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.deleteUser: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-deleteUser-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name

try {
    $api_instance->deleteUser($userName);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->deleteUser: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-deleteUser-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name

eval { 
    $api_instance->deleteUser(userName => $userName);
};
if ($@) {
    warn "Exception when calling UsersApi->deleteUser: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-deleteUser-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name

try: 
    # Delete single user
    api_instance.deleteUser(userName)
except ApiException as e:
    print("Exception when calling UsersApi->deleteUser: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteUser_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteUser_userName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Server Error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-getUser">
                      <article id="api-Users-getUser-0" data-group="User" data-name="getUser" data-version="0">
                        <div class="pull-left">
                          <h1>getUser</h1>
                          <p>Get single user</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-getUser-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-getUser-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-getUser-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-getUser-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-getUser-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-getUser-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-getUser-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-getUser-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-getUser-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-getUser-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-getUser-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-getUser-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-getUser-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            UserResponseSwagger result = apiInstance.getUser(userName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#getUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-getUser-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            UserResponseSwagger result = apiInstance.getUser(userName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#getUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-getUser-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-getUser-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Users/*)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Get single user
[apiInstance getUserWith:userName
    fields:fields
              completionHandler: ^(UserResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUser-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getUser(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-getUser-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-getUser-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getUserExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Users/*)

            try
            {
                // Get single user
                UserResponseSwagger result = apiInstance.getUser(userName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.getUser: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUser-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getUser($userName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->getUser: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUser-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getUser(userName => $userName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UsersApi->getUser: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUser-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Users/*)

try: 
    # Get single user
    api_response = api_instance.getUser(userName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UsersApi->getUser: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getUser_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getUser_userName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Users/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getUser_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getUser_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getUser-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getUser-200-schema">
                                  <div id='responses-getUser-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/UserResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getUser-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getUser-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getUser-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-getUsers">
                      <article id="api-Users-getUsers-0" data-group="User" data-name="getUsers" data-version="0">
                        <div class="pull-left">
                          <h1>getUsers</h1>
                          <p>Get all users</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-getUsers-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-getUsers-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-getUsers-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-getUsers-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-getUsers-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-getUsers-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-getUsers-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-getUsers-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-getUsers-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-getUsers-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-getUsers-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-getUsers-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-getUsers-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[UserResponseSwagger] result = apiInstance.getUsers(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#getUsers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-getUsers-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[UserResponseSwagger] result = apiInstance.getUsers(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#getUsers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-getUsers-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-getUsers-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Users/user_name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Users/user_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Get all users
[apiInstance getUsersWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[UserResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUsers-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getUsers(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-getUsers-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-getUsers-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getUsersExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Users/user_name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Users/user_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all users
                array[UserResponseSwagger] result = apiInstance.getUsers(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.getUsers: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUsers-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getUsers($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->getUsers: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUsers-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getUsers(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UsersApi->getUsers: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUsers-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Users/user_name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Users/user_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all users
    api_response = api_instance.getUsers(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UsersApi->getUsers: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Users/user_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getUsers_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getUsers_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Users/user_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getUsers_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getUsers_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getUsers_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getUsers_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getUsers_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getUsers_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getUsers_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getUsers_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getUsers-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getUsers-200-schema">
                                  <div id='responses-getUsers-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/UserResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getUsers-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getUsers-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getUsers-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-updateUser">
                      <article id="api-Users-updateUser-0" data-group="User" data-name="updateUser" data-version="0">
                        <div class="pull-left">
                          <h1>updateUser</h1>
                          <p>Update user details</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/users/{userName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-updateUser-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-updateUser-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-updateUser-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-updateUser-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-updateUser-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-updateUser-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-updateUser-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-updateUser-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-updateUser-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-updateUser-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-updateUser-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-updateUser-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/users/{userName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-updateUser-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        UserRequestUpdateUserSwagger body = ; // UserRequestUpdateUserSwagger | 
        try {
            apiInstance.updateUser(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#updateUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-updateUser-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        UserRequestUpdateUserSwagger body = ; // UserRequestUpdateUserSwagger | 
        try {
            apiInstance.updateUser(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#updateUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-updateUser-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-updateUser-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
UserRequestUpdateUserSwagger *body = ; //  (optional)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Update user details
[apiInstance updateUserWith:userName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-updateUser-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var opts = { 
  'body':  // {UserRequestUpdateUserSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateUser(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-updateUser-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-updateUser-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateUserExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var body = new UserRequestUpdateUserSwagger(); // UserRequestUpdateUserSwagger |  (optional) 

            try
            {
                // Update user details
                apiInstance.updateUser(userName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.updateUser: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-updateUser-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$body = ; // UserRequestUpdateUserSwagger | 

try {
    $api_instance->updateUser($userName, $body);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->updateUser: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-updateUser-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $body = WWW::SwaggerClient::Object::UserRequestUpdateUserSwagger->new(); # UserRequestUpdateUserSwagger | 

eval { 
    $api_instance->updateUser(userName => $userName, body => $body);
};
if ($@) {
    warn "Exception when calling UsersApi->updateUser: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-updateUser-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
body =  # UserRequestUpdateUserSwagger |  (optional)

try: 
    # Update user details
    api_instance.updateUser(userName, body=body)
except ApiException as e:
    print("Exception when calling UsersApi->updateUser: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateUser_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateUser_userName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/UserRequestUpdateUserSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateUser_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateUser_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-userAuthorizationServiceGetAuthorization">
                      <article id="api-Users-userAuthorizationServiceGetAuthorization-0" data-group="User" data-name="userAuthorizationServiceGetAuthorization" data-version="0">
                        <div class="pull-left">
                          <h1>userAuthorizationServiceGetAuthorization</h1>
                          <p>Get user authorization</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns user authorization details.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}/authorizations/{authorization_id}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-userAuthorizationServiceGetAuthorization-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}/authorizations/{authorization_id}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String authorizationId = authorizationId_example; // String | Authorization Id
        String fields = fields_example; // String | Filter user authorization details
        try {
            UserAuthorizationResponse result = apiInstance.userAuthorizationServiceGetAuthorization(userName, authorizationId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userAuthorizationServiceGetAuthorization");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String authorizationId = authorizationId_example; // String | Authorization Id
        String fields = fields_example; // String | Filter user authorization details
        try {
            UserAuthorizationResponse result = apiInstance.userAuthorizationServiceGetAuthorization(userName, authorizationId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userAuthorizationServiceGetAuthorization");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *authorizationId = authorizationId_example; // Authorization Id
String *fields = fields_example; // Filter user authorization details (optional) (default to AuthorizationInfo/*)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Get user authorization
[apiInstance userAuthorizationServiceGetAuthorizationWith:userName
    authorizationId:authorizationId
    fields:fields
              completionHandler: ^(UserAuthorizationResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var authorizationId = authorizationId_example; // {String} Authorization Id

var opts = { 
  'fields': fields_example // {String} Filter user authorization details
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.userAuthorizationServiceGetAuthorization(userName, authorizationId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class userAuthorizationServiceGetAuthorizationExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var authorizationId = authorizationId_example;  // String | Authorization Id
            var fields = fields_example;  // String | Filter user authorization details (optional)  (default to AuthorizationInfo/*)

            try
            {
                // Get user authorization
                UserAuthorizationResponse result = apiInstance.userAuthorizationServiceGetAuthorization(userName, authorizationId, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.userAuthorizationServiceGetAuthorization: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$authorizationId = authorizationId_example; // String | Authorization Id
$fields = fields_example; // String | Filter user authorization details

try {
    $result = $api_instance->userAuthorizationServiceGetAuthorization($userName, $authorizationId, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->userAuthorizationServiceGetAuthorization: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $authorizationId = authorizationId_example; # String | Authorization Id
my $fields = fields_example; # String | Filter user authorization details

eval { 
    my $result = $api_instance->userAuthorizationServiceGetAuthorization(userName => $userName, authorizationId => $authorizationId, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UsersApi->userAuthorizationServiceGetAuthorization: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
authorizationId = authorizationId_example # String | Authorization Id
fields = fields_example # String | Filter user authorization details (optional) (default to AuthorizationInfo/*)

try: 
    # Get user authorization
    api_response = api_instance.userAuthorizationServiceGetAuthorization(userName, authorizationId, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UsersApi->userAuthorizationServiceGetAuthorization: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorization_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorization_userName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">authorization_id*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "authorization_id",
  "in" : "path",
  "description" : "Authorization Id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorization_authorizationId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorization_authorizationId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter user authorization details",
  "required" : false,
  "type" : "string",
  "default" : "AuthorizationInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorization_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorization_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-userAuthorizationServiceGetAuthorization-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-userAuthorizationServiceGetAuthorization-200-schema">
                                  <div id='responses-userAuthorizationServiceGetAuthorization-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/UserAuthorizationResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-userAuthorizationServiceGetAuthorization-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-userAuthorizationServiceGetAuthorization-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-userAuthorizationServiceGetAuthorization-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-userAuthorizationServiceGetAuthorizations">
                      <article id="api-Users-userAuthorizationServiceGetAuthorizations-0" data-group="User" data-name="userAuthorizationServiceGetAuthorizations" data-version="0">
                        <div class="pull-left">
                          <h1>userAuthorizationServiceGetAuthorizations</h1>
                          <p>Get all authorizations</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all authorization for user.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}/authorizations</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}/authorizations?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter user authorization details
        String sortBy = sortBy_example; // String | Sort user authorizations (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[UserAuthorizationResponse] result = apiInstance.userAuthorizationServiceGetAuthorizations(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userAuthorizationServiceGetAuthorizations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter user authorization details
        String sortBy = sortBy_example; // String | Sort user authorizations (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[UserAuthorizationResponse] result = apiInstance.userAuthorizationServiceGetAuthorizations(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userAuthorizationServiceGetAuthorizations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *fields = fields_example; // Filter user authorization details (optional) (default to AuthorizationInfo/*)
String *sortBy = sortBy_example; // Sort user authorizations (asc | desc) (optional) (default to AuthorizationInfo/user_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive). Valid values are :offset | "end" (optional)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Get all authorizations
[apiInstance userAuthorizationServiceGetAuthorizationsWith:userName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[UserAuthorizationResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var opts = { 
  'fields': fields_example, // {String} Filter user authorization details
  'sortBy': sortBy_example, // {String} Sort user authorizations (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive). Valid values are :offset | "start"
  'to': to_example // {String} The ending page resource (inclusive). Valid values are :offset | "end"
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.userAuthorizationServiceGetAuthorizations(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class userAuthorizationServiceGetAuthorizationsExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var fields = fields_example;  // String | Filter user authorization details (optional)  (default to AuthorizationInfo/*)
            var sortBy = sortBy_example;  // String | Sort user authorizations (asc | desc) (optional)  (default to AuthorizationInfo/user_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive). Valid values are :offset | "start" (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive). Valid values are :offset | "end" (optional) 

            try
            {
                // Get all authorizations
                array[UserAuthorizationResponse] result = apiInstance.userAuthorizationServiceGetAuthorizations(userName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.userAuthorizationServiceGetAuthorizations: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$fields = fields_example; // String | Filter user authorization details
$sortBy = sortBy_example; // String | Sort user authorizations (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
$to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"

try {
    $result = $api_instance->userAuthorizationServiceGetAuthorizations($userName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->userAuthorizationServiceGetAuthorizations: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $fields = fields_example; # String | Filter user authorization details
my $sortBy = sortBy_example; # String | Sort user authorizations (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive). Valid values are :offset | "start"
my $to = to_example; # String | The ending page resource (inclusive). Valid values are :offset | "end"

eval { 
    my $result = $api_instance->userAuthorizationServiceGetAuthorizations(userName => $userName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UsersApi->userAuthorizationServiceGetAuthorizations: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
fields = fields_example # String | Filter user authorization details (optional) (default to AuthorizationInfo/*)
sortBy = sortBy_example # String | Sort user authorizations (asc | desc) (optional) (default to AuthorizationInfo/user_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive). Valid values are :offset | "end" (optional)

try: 
    # Get all authorizations
    api_response = api_instance.userAuthorizationServiceGetAuthorizations(userName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UsersApi->userAuthorizationServiceGetAuthorizations: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorizations_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorizations_userName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter user authorization details",
  "required" : false,
  "type" : "string",
  "default" : "AuthorizationInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorizations_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorizations_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort user authorizations (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "AuthorizationInfo/user_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorizations_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorizations_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorizations_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorizations_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive). Valid values are :offset | \"start\"",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorizations_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorizations_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive). Valid values are :offset | \"end\"",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorizations_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorizations_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-userAuthorizationServiceGetAuthorizations-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-userAuthorizationServiceGetAuthorizations-200-schema">
                                  <div id='responses-userAuthorizationServiceGetAuthorizations-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/UserAuthorizationResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-userAuthorizationServiceGetAuthorizations-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-userAuthorizationServiceGetAuthorizations-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-userAuthorizationServiceGetAuthorizations-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-userPrivilegeServiceGetPrivilege">
                      <article id="api-Users-userPrivilegeServiceGetPrivilege-0" data-group="User" data-name="userPrivilegeServiceGetPrivilege" data-version="0">
                        <div class="pull-left">
                          <h1>userPrivilegeServiceGetPrivilege</h1>
                          <p>Get user privilege</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns user privilege details.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}/privileges/{privilegeId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-userPrivilegeServiceGetPrivilege-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}/privileges/{privilegeId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String privilegeId = privilegeId_example; // String | privilege id
        String fields = fields_example; // String | Filter user privilege details
        try {
            UserPrivilegeResponse result = apiInstance.userPrivilegeServiceGetPrivilege(userName, privilegeId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userPrivilegeServiceGetPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String privilegeId = privilegeId_example; // String | privilege id
        String fields = fields_example; // String | Filter user privilege details
        try {
            UserPrivilegeResponse result = apiInstance.userPrivilegeServiceGetPrivilege(userName, privilegeId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userPrivilegeServiceGetPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *privilegeId = privilegeId_example; // privilege id
String *fields = fields_example; // Filter user privilege details (optional) (default to PrivilegeInfo/*)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Get user privilege
[apiInstance userPrivilegeServiceGetPrivilegeWith:userName
    privilegeId:privilegeId
    fields:fields
              completionHandler: ^(UserPrivilegeResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var privilegeId = privilegeId_example; // {String} privilege id

var opts = { 
  'fields': fields_example // {String} Filter user privilege details
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.userPrivilegeServiceGetPrivilege(userName, privilegeId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class userPrivilegeServiceGetPrivilegeExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var privilegeId = privilegeId_example;  // String | privilege id
            var fields = fields_example;  // String | Filter user privilege details (optional)  (default to PrivilegeInfo/*)

            try
            {
                // Get user privilege
                UserPrivilegeResponse result = apiInstance.userPrivilegeServiceGetPrivilege(userName, privilegeId, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.userPrivilegeServiceGetPrivilege: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$privilegeId = privilegeId_example; // String | privilege id
$fields = fields_example; // String | Filter user privilege details

try {
    $result = $api_instance->userPrivilegeServiceGetPrivilege($userName, $privilegeId, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->userPrivilegeServiceGetPrivilege: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $privilegeId = privilegeId_example; # String | privilege id
my $fields = fields_example; # String | Filter user privilege details

eval { 
    my $result = $api_instance->userPrivilegeServiceGetPrivilege(userName => $userName, privilegeId => $privilegeId, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UsersApi->userPrivilegeServiceGetPrivilege: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
privilegeId = privilegeId_example # String | privilege id
fields = fields_example # String | Filter user privilege details (optional) (default to PrivilegeInfo/*)

try: 
    # Get user privilege
    api_response = api_instance.userPrivilegeServiceGetPrivilege(userName, privilegeId, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UsersApi->userPrivilegeServiceGetPrivilege: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivilege_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivilege_userName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">privilegeId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "privilegeId",
  "in" : "path",
  "description" : "privilege id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivilege_privilegeId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivilege_privilegeId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter user privilege details",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivilege_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivilege_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-userPrivilegeServiceGetPrivilege-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-userPrivilegeServiceGetPrivilege-200-schema">
                                  <div id='responses-userPrivilegeServiceGetPrivilege-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/UserPrivilegeResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-userPrivilegeServiceGetPrivilege-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-userPrivilegeServiceGetPrivilege-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-userPrivilegeServiceGetPrivilege-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-userPrivilegeServiceGetPrivileges">
                      <article id="api-Users-userPrivilegeServiceGetPrivileges-0" data-group="User" data-name="userPrivilegeServiceGetPrivileges" data-version="0">
                        <div class="pull-left">
                          <h1>userPrivilegeServiceGetPrivileges</h1>
                          <p>Get all privileges</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all privileges for user.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}/privileges</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-userPrivilegeServiceGetPrivileges-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}/privileges?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter user privileges
        String sortBy = sortBy_example; // String | Sort user privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[UserPrivilegeResponse] result = apiInstance.userPrivilegeServiceGetPrivileges(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userPrivilegeServiceGetPrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter user privileges
        String sortBy = sortBy_example; // String | Sort user privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[UserPrivilegeResponse] result = apiInstance.userPrivilegeServiceGetPrivileges(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userPrivilegeServiceGetPrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *fields = fields_example; // Filter user privileges (optional) (default to PrivilegeInfo/*)
String *sortBy = sortBy_example; // Sort user privileges (asc | desc) (optional) (default to PrivilegeInfo/user_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive). Valid values are :offset | "end" (optional)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Get all privileges
[apiInstance userPrivilegeServiceGetPrivilegesWith:userName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[UserPrivilegeResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var opts = { 
  'fields': fields_example, // {String} Filter user privileges
  'sortBy': sortBy_example, // {String} Sort user privileges (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive). Valid values are :offset | "start"
  'to': to_example // {String} The ending page resource (inclusive). Valid values are :offset | "end"
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.userPrivilegeServiceGetPrivileges(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class userPrivilegeServiceGetPrivilegesExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var fields = fields_example;  // String | Filter user privileges (optional)  (default to PrivilegeInfo/*)
            var sortBy = sortBy_example;  // String | Sort user privileges (asc | desc) (optional)  (default to PrivilegeInfo/user_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive). Valid values are :offset | "start" (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive). Valid values are :offset | "end" (optional) 

            try
            {
                // Get all privileges
                array[UserPrivilegeResponse] result = apiInstance.userPrivilegeServiceGetPrivileges(userName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.userPrivilegeServiceGetPrivileges: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$fields = fields_example; // String | Filter user privileges
$sortBy = sortBy_example; // String | Sort user privileges (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
$to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"

try {
    $result = $api_instance->userPrivilegeServiceGetPrivileges($userName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->userPrivilegeServiceGetPrivileges: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $fields = fields_example; # String | Filter user privileges
my $sortBy = sortBy_example; # String | Sort user privileges (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive). Valid values are :offset | "start"
my $to = to_example; # String | The ending page resource (inclusive). Valid values are :offset | "end"

eval { 
    my $result = $api_instance->userPrivilegeServiceGetPrivileges(userName => $userName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UsersApi->userPrivilegeServiceGetPrivileges: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
fields = fields_example # String | Filter user privileges (optional) (default to PrivilegeInfo/*)
sortBy = sortBy_example # String | Sort user privileges (asc | desc) (optional) (default to PrivilegeInfo/user_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive). Valid values are :offset | "end" (optional)

try: 
    # Get all privileges
    api_response = api_instance.userPrivilegeServiceGetPrivileges(userName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UsersApi->userPrivilegeServiceGetPrivileges: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string",
  "default" : "admin"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivileges_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivileges_userName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter user privileges",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivileges_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivileges_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort user privileges (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/user_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivileges_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivileges_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivileges_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivileges_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive). Valid values are :offset | \"start\"",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivileges_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivileges_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive). Valid values are :offset | \"end\"",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivileges_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivileges_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-userPrivilegeServiceGetPrivileges-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-userPrivilegeServiceGetPrivileges-200-schema">
                                  <div id='responses-userPrivilegeServiceGetPrivileges-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/UserPrivilegeResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-userPrivilegeServiceGetPrivileges-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-userPrivilegeServiceGetPrivileges-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-userPrivilegeServiceGetPrivileges-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Views">
                  <h1>Views</h1>
                    <div id="api-Views-createPrivilege">
                      <article id="api-Views-createPrivilege-0" data-group="User" data-name="createPrivilege" data-version="0">
                        <div class="pull-left">
                          <h1>createPrivilege</h1>
                          <p>Create view instance privilege</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}/privileges</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-createPrivilege-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-createPrivilege-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-createPrivilege-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-createPrivilege-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-createPrivilege-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-createPrivilege-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-createPrivilege-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-createPrivilege-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-createPrivilege-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-createPrivilege-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-createPrivilege-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-createPrivilege-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}/privileges"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-createPrivilege-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        ViewPrivilegeService body = ; // ViewPrivilegeService | 
        try {
            apiInstance.createPrivilege(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-createPrivilege-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        ViewPrivilegeService body = ; // ViewPrivilegeService | 
        try {
            apiInstance.createPrivilege(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-createPrivilege-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-createPrivilege-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *instanceName = instanceName_example; // instance name
ViewPrivilegeService *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Create view instance privilege
[apiInstance createPrivilegeWith:viewName
    version:version
    instanceName:instanceName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createPrivilege-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var instanceName = instanceName_example; // {String} instance name

var opts = { 
  'body':  // {ViewPrivilegeService} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createPrivilege(viewName, version, instanceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-createPrivilege-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-createPrivilege-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createPrivilegeExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var instanceName = instanceName_example;  // String | instance name
            var body = new ViewPrivilegeService(); // ViewPrivilegeService |  (optional) 

            try
            {
                // Create view instance privilege
                apiInstance.createPrivilege(viewName, version, instanceName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.createPrivilege: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createPrivilege-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$instanceName = instanceName_example; // String | instance name
$body = ; // ViewPrivilegeService | 

try {
    $api_instance->createPrivilege($viewName, $version, $instanceName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->createPrivilege: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createPrivilege-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $instanceName = instanceName_example; # String | instance name
my $body = WWW::SwaggerClient::Object::ViewPrivilegeService->new(); # ViewPrivilegeService | 

eval { 
    $api_instance->createPrivilege(viewName => $viewName, version => $version, instanceName => $instanceName, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->createPrivilege: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createPrivilege-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
instanceName = instanceName_example # String | instance name
body =  # ViewPrivilegeService |  (optional)

try: 
    # Create view instance privilege
    api_instance.createPrivilege(viewName, version, instanceName, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->createPrivilege: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createPrivilege_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createPrivilege_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createPrivilege_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createPrivilege_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createPrivilege_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createPrivilege_instanceName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewPrivilegeService"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createPrivilege_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createPrivilege_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-createService">
                      <article id="api-Views-createService-0" data-group="User" data-name="createService" data-version="0">
                        <div class="pull-left">
                          <h1>createService</h1>
                          <p>Create view instance</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-createService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-createService-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-createService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-createService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-createService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-createService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-createService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-createService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-createService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-createService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-createService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-createService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-createService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.createService(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-createService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.createService(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-createService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-createService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // 
String *instanceName = instanceName_example; // instance name
ViewInstanceResponse *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Create view instance
[apiInstance createServiceWith:viewName
    version:version
    instanceName:instanceName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} 

var instanceName = instanceName_example; // {String} instance name

var opts = { 
  'body':  // {ViewInstanceResponse} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createService(viewName, version, instanceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-createService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-createService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | 
            var instanceName = instanceName_example;  // String | instance name
            var body = new ViewInstanceResponse(); // ViewInstanceResponse |  (optional) 

            try
            {
                // Create view instance
                apiInstance.createService(viewName, version, instanceName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.createService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | 
$instanceName = instanceName_example; // String | instance name
$body = ; // ViewInstanceResponse | 

try {
    $api_instance->createService($viewName, $version, $instanceName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->createService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | 
my $instanceName = instanceName_example; # String | instance name
my $body = WWW::SwaggerClient::Object::ViewInstanceResponse->new(); # ViewInstanceResponse | 

eval { 
    $api_instance->createService(viewName => $viewName, version => $version, instanceName => $instanceName, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->createService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | 
instanceName = instanceName_example # String | instance name
body =  # ViewInstanceResponse |  (optional)

try: 
    # Create view instance
    api_instance.createService(viewName, version, instanceName, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->createService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createService_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createService_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createService_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createService_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createService_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createService_instanceName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewInstanceResponse"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createService_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createService_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-createServices">
                      <article id="api-Views-createServices-0" data-group="User" data-name="createServices" data-version="0">
                        <div class="pull-left">
                          <h1>createServices</h1>
                          <p>Create view instances</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/views/{viewName}/versions/{version}/instances</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-createServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-createServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-createServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-createServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-createServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-createServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-createServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-createServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-createServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-createServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-createServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-createServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-createServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | 
        String version = version_example; // String | 
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.createServices(viewName, version, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-createServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | 
        String version = version_example; // String | 
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.createServices(viewName, version, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-createServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-createServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // 
String *version = version_example; // 
ViewInstanceResponse *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Create view instances
[apiInstance createServicesWith:viewName
    version:version
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} 

var version = version_example; // {String} 

var opts = { 
  'body':  // {ViewInstanceResponse} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createServices(viewName, version, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-createServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-createServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createServicesExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | 
            var version = version_example;  // String | 
            var body = new ViewInstanceResponse(); // ViewInstanceResponse |  (optional) 

            try
            {
                // Create view instances
                apiInstance.createServices(viewName, version, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.createServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | 
$version = version_example; // String | 
$body = ; // ViewInstanceResponse | 

try {
    $api_instance->createServices($viewName, $version, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->createServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | 
my $version = version_example; # String | 
my $body = WWW::SwaggerClient::Object::ViewInstanceResponse->new(); # ViewInstanceResponse | 

eval { 
    $api_instance->createServices(viewName => $viewName, version => $version, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->createServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | 
version = version_example # String | 
body =  # ViewInstanceResponse |  (optional)

try: 
    # Create view instances
    api_instance.createServices(viewName, version, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->createServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createServices_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createServices_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createServices_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createServices_version"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewInstanceResponse"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createServices_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createServices_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-createUrl">
                      <article id="api-Views-createUrl-0" data-group="User" data-name="createUrl" data-version="0">
                        <div class="pull-left">
                          <h1>createUrl</h1>
                          <p>Create view URL</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/view/urls/{urlName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-createUrl-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-createUrl-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-createUrl-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-createUrl-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-createUrl-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-createUrl-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-createUrl-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-createUrl-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-createUrl-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-createUrl-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-createUrl-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-createUrl-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/view/urls/{urlName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-createUrl-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        ViewUrlResponseSwagger body = ; // ViewUrlResponseSwagger | 
        try {
            apiInstance.createUrl(urlName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-createUrl-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        ViewUrlResponseSwagger body = ; // ViewUrlResponseSwagger | 
        try {
            apiInstance.createUrl(urlName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-createUrl-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-createUrl-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *urlName = urlName_example; // 
ViewUrlResponseSwagger *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Create view URL
[apiInstance createUrlWith:urlName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createUrl-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var urlName = urlName_example; // {String} 

var opts = { 
  'body':  // {ViewUrlResponseSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createUrl(urlName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-createUrl-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-createUrl-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createUrlExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var urlName = urlName_example;  // String | 
            var body = new ViewUrlResponseSwagger(); // ViewUrlResponseSwagger |  (optional) 

            try
            {
                // Create view URL
                apiInstance.createUrl(urlName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.createUrl: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createUrl-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$urlName = urlName_example; // String | 
$body = ; // ViewUrlResponseSwagger | 

try {
    $api_instance->createUrl($urlName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->createUrl: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createUrl-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $urlName = urlName_example; # String | 
my $body = WWW::SwaggerClient::Object::ViewUrlResponseSwagger->new(); # ViewUrlResponseSwagger | 

eval { 
    $api_instance->createUrl(urlName => $urlName, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->createUrl: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createUrl-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
urlName = urlName_example # String | 
body =  # ViewUrlResponseSwagger |  (optional)

try: 
    # Create view URL
    api_instance.createUrl(urlName, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->createUrl: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">urlName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "urlName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createUrl_urlName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createUrl_urlName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewUrlResponseSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createUrl_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createUrl_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-deletePrivilege">
                      <article id="api-Views-deletePrivilege-0" data-group="User" data-name="deletePrivilege" data-version="0">
                        <div class="pull-left">
                          <h1>deletePrivilege</h1>
                          <p>Delete privileges</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}/privileges/{privilegeId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-deletePrivilege-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-deletePrivilege-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-deletePrivilege-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-deletePrivilege-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-deletePrivilege-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-deletePrivilege-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-deletePrivilege-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-deletePrivilege-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-deletePrivilege-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-deletePrivilege-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-deletePrivilege-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-deletePrivilege-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}/privileges/{privilegeId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-deletePrivilege-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String privilegeId = privilegeId_example; // String | privilege id
        try {
            apiInstance.deletePrivilege(viewName, version, instanceName, privilegeId);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deletePrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-deletePrivilege-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String privilegeId = privilegeId_example; // String | privilege id
        try {
            apiInstance.deletePrivilege(viewName, version, instanceName, privilegeId);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deletePrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-deletePrivilege-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-deletePrivilege-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *instanceName = instanceName_example; // instance name
String *privilegeId = privilegeId_example; // privilege id

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Delete privileges
[apiInstance deletePrivilegeWith:viewName
    version:version
    instanceName:instanceName
    privilegeId:privilegeId
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivilege-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var instanceName = instanceName_example; // {String} instance name

var privilegeId = privilegeId_example; // {String} privilege id


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deletePrivilege(viewName, version, instanceName, privilegeId, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-deletePrivilege-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-deletePrivilege-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deletePrivilegeExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var instanceName = instanceName_example;  // String | instance name
            var privilegeId = privilegeId_example;  // String | privilege id

            try
            {
                // Delete privileges
                apiInstance.deletePrivilege(viewName, version, instanceName, privilegeId);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.deletePrivilege: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivilege-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$instanceName = instanceName_example; // String | instance name
$privilegeId = privilegeId_example; // String | privilege id

try {
    $api_instance->deletePrivilege($viewName, $version, $instanceName, $privilegeId);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->deletePrivilege: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivilege-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $instanceName = instanceName_example; # String | instance name
my $privilegeId = privilegeId_example; # String | privilege id

eval { 
    $api_instance->deletePrivilege(viewName => $viewName, version => $version, instanceName => $instanceName, privilegeId => $privilegeId);
};
if ($@) {
    warn "Exception when calling ViewsApi->deletePrivilege: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivilege-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
instanceName = instanceName_example # String | instance name
privilegeId = privilegeId_example # String | privilege id

try: 
    # Delete privileges
    api_instance.deletePrivilege(viewName, version, instanceName, privilegeId)
except ApiException as e:
    print("Exception when calling ViewsApi->deletePrivilege: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deletePrivilege_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deletePrivilege_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deletePrivilege_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deletePrivilege_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deletePrivilege_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deletePrivilege_instanceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">privilegeId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "privilegeId",
  "in" : "path",
  "description" : "privilege id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deletePrivilege_privilegeId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deletePrivilege_privilegeId"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-deletePrivileges">
                      <article id="api-Views-deletePrivileges-0" data-group="User" data-name="deletePrivileges" data-version="0">
                        <div class="pull-left">
                          <h1>deletePrivileges</h1>
                          <p>Delete view instance privileges</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}/privileges</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-deletePrivileges-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-deletePrivileges-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-deletePrivileges-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-deletePrivileges-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-deletePrivileges-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-deletePrivileges-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-deletePrivileges-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-deletePrivileges-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-deletePrivileges-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-deletePrivileges-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-deletePrivileges-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-deletePrivileges-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}/privileges"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-deletePrivileges-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String viewVersion = viewVersion_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        try {
            apiInstance.deletePrivileges(viewName, viewVersion, instanceName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deletePrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-deletePrivileges-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String viewVersion = viewVersion_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        try {
            apiInstance.deletePrivileges(viewName, viewVersion, instanceName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deletePrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-deletePrivileges-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-deletePrivileges-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *viewVersion = viewVersion_example; // view version
String *instanceName = instanceName_example; // instance name

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Delete view instance privileges
[apiInstance deletePrivilegesWith:viewName
    viewVersion:viewVersion
    instanceName:instanceName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivileges-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var viewVersion = viewVersion_example; // {String} view version

var instanceName = instanceName_example; // {String} instance name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deletePrivileges(viewName, viewVersion, instanceName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-deletePrivileges-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-deletePrivileges-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deletePrivilegesExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var viewVersion = viewVersion_example;  // String | view version
            var instanceName = instanceName_example;  // String | instance name

            try
            {
                // Delete view instance privileges
                apiInstance.deletePrivileges(viewName, viewVersion, instanceName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.deletePrivileges: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivileges-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$viewVersion = viewVersion_example; // String | view version
$instanceName = instanceName_example; // String | instance name

try {
    $api_instance->deletePrivileges($viewName, $viewVersion, $instanceName);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->deletePrivileges: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivileges-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $viewVersion = viewVersion_example; # String | view version
my $instanceName = instanceName_example; # String | instance name

eval { 
    $api_instance->deletePrivileges(viewName => $viewName, viewVersion => $viewVersion, instanceName => $instanceName);
};
if ($@) {
    warn "Exception when calling ViewsApi->deletePrivileges: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivileges-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
viewVersion = viewVersion_example # String | view version
instanceName = instanceName_example # String | instance name

try: 
    # Delete view instance privileges
    api_instance.deletePrivileges(viewName, viewVersion, instanceName)
except ApiException as e:
    print("Exception when calling ViewsApi->deletePrivileges: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deletePrivileges_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deletePrivileges_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">viewVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewVersion",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deletePrivileges_viewVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deletePrivileges_viewVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deletePrivileges_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deletePrivileges_instanceName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-deleteService">
                      <article id="api-Views-deleteService-0" data-group="User" data-name="deleteService" data-version="0">
                        <div class="pull-left">
                          <h1>deleteService</h1>
                          <p>Delete view instance</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-deleteService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-deleteService-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-deleteService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-deleteService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-deleteService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-deleteService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-deleteService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-deleteService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-deleteService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-deleteService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-deleteService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-deleteService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-deleteService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        try {
            apiInstance.deleteService(viewName, version, instanceName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deleteService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-deleteService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        try {
            apiInstance.deleteService(viewName, version, instanceName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deleteService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-deleteService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-deleteService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // 
String *instanceName = instanceName_example; // instance name

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Delete view instance
[apiInstance deleteServiceWith:viewName
    version:version
    instanceName:instanceName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} 

var instanceName = instanceName_example; // {String} instance name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteService(viewName, version, instanceName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-deleteService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-deleteService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | 
            var instanceName = instanceName_example;  // String | instance name

            try
            {
                // Delete view instance
                apiInstance.deleteService(viewName, version, instanceName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.deleteService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | 
$instanceName = instanceName_example; // String | instance name

try {
    $api_instance->deleteService($viewName, $version, $instanceName);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->deleteService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | 
my $instanceName = instanceName_example; # String | instance name

eval { 
    $api_instance->deleteService(viewName => $viewName, version => $version, instanceName => $instanceName);
};
if ($@) {
    warn "Exception when calling ViewsApi->deleteService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | 
instanceName = instanceName_example # String | instance name

try: 
    # Delete view instance
    api_instance.deleteService(viewName, version, instanceName)
except ApiException as e:
    print("Exception when calling ViewsApi->deleteService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteService_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteService_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteService_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteService_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteService_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteService_instanceName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-deleteUrl">
                      <article id="api-Views-deleteUrl-0" data-group="User" data-name="deleteUrl" data-version="0">
                        <div class="pull-left">
                          <h1>deleteUrl</h1>
                          <p>Delete view URL</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/view/urls/{urlName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-deleteUrl-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-deleteUrl-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-deleteUrl-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-deleteUrl-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-deleteUrl-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-deleteUrl-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-deleteUrl-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-deleteUrl-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-deleteUrl-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-deleteUrl-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-deleteUrl-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-deleteUrl-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/view/urls/{urlName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-deleteUrl-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        try {
            apiInstance.deleteUrl(urlName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deleteUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-deleteUrl-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        try {
            apiInstance.deleteUrl(urlName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deleteUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-deleteUrl-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-deleteUrl-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *urlName = urlName_example; // 

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Delete view URL
[apiInstance deleteUrlWith:urlName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteUrl-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var urlName = urlName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteUrl(urlName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-deleteUrl-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-deleteUrl-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteUrlExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var urlName = urlName_example;  // String | 

            try
            {
                // Delete view URL
                apiInstance.deleteUrl(urlName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.deleteUrl: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteUrl-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$urlName = urlName_example; // String | 

try {
    $api_instance->deleteUrl($urlName);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->deleteUrl: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteUrl-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $urlName = urlName_example; # String | 

eval { 
    $api_instance->deleteUrl(urlName => $urlName);
};
if ($@) {
    warn "Exception when calling ViewsApi->deleteUrl: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteUrl-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
urlName = urlName_example # String | 

try: 
    # Delete view URL
    api_instance.deleteUrl(urlName)
except ApiException as e:
    print("Exception when calling ViewsApi->deleteUrl: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">urlName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "urlName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteUrl_urlName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteUrl_urlName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getPermission">
                      <article id="api-Views-getPermission-0" data-group="User" data-name="getPermission" data-version="0">
                        <div class="pull-left">
                          <h1>getPermission</h1>
                          <p>Get single view permission</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions/{version}/permissions/{permissionId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getPermission-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getPermission-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getPermission-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getPermission-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getPermission-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getPermission-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getPermission-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getPermission-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getPermission-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getPermission-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getPermission-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getPermission-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/permissions/{permissionId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getPermission-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String permissionId = permissionId_example; // String | permission id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewPermissionResponse result = apiInstance.getPermission(viewName, version, permissionId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPermission");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getPermission-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String permissionId = permissionId_example; // String | permission id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewPermissionResponse result = apiInstance.getPermission(viewName, version, permissionId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPermission");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getPermission-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getPermission-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *permissionId = permissionId_example; // permission id
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to PermissionInfo/*)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get single view permission
[apiInstance getPermissionWith:viewName
    version:version
    permissionId:permissionId
    fields:fields
              completionHandler: ^(ViewPermissionResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermission-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var permissionId = permissionId_example; // {String} permission id

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getPermission(viewName, version, permissionId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getPermission-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getPermission-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getPermissionExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var permissionId = permissionId_example;  // String | permission id
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to PermissionInfo/*)

            try
            {
                // Get single view permission
                ViewPermissionResponse result = apiInstance.getPermission(viewName, version, permissionId, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getPermission: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermission-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$permissionId = permissionId_example; // String | permission id
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getPermission($viewName, $version, $permissionId, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getPermission: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermission-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $permissionId = permissionId_example; # String | permission id
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getPermission(viewName => $viewName, version => $version, permissionId => $permissionId, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getPermission: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermission-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
permissionId = permissionId_example # String | permission id
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to PermissionInfo/*)

try: 
    # Get single view permission
    api_response = api_instance.getPermission(viewName, version, permissionId, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getPermission: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermission_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermission_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermission_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermission_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">permissionId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "permissionId",
  "in" : "path",
  "description" : "permission id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermission_permissionId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermission_permissionId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "PermissionInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermission_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermission_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getPermission-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getPermission-200-schema">
                                  <div id='responses-getPermission-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ViewPermissionResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getPermission-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getPermission-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getPermission-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getPermissions">
                      <article id="api-Views-getPermissions-0" data-group="User" data-name="getPermissions" data-version="0">
                        <div class="pull-left">
                          <h1>getPermissions</h1>
                          <p>Get all permissions for a view</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions/{version}/permissions</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getPermissions-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getPermissions-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getPermissions-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getPermissions-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getPermissions-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getPermissions-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getPermissions-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getPermissions-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getPermissions-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getPermissions-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getPermissions-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getPermissions-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/permissions?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getPermissions-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewPermissionResponse] result = apiInstance.getPermissions(viewName, version, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPermissions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getPermissions-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewPermissionResponse] result = apiInstance.getPermissions(viewName, version, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPermissions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getPermissions-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getPermissions-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to PermissionInfo/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get all permissions for a view
[apiInstance getPermissionsWith:viewName
    version:version
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ViewPermissionResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermissions-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getPermissions(viewName, version, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getPermissions-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getPermissions-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getPermissionsExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to PermissionInfo/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all permissions for a view
                array[ViewPermissionResponse] result = apiInstance.getPermissions(viewName, version, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getPermissions: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermissions-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getPermissions($viewName, $version, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getPermissions: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermissions-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getPermissions(viewName => $viewName, version => $version, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getPermissions: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermissions-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to PermissionInfo/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all permissions for a view
    api_response = api_instance.getPermissions(viewName, version, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getPermissions: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermissions_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermissions_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermissions_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermissions_version"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "PermissionInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermissions_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermissions_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermissions_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermissions_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermissions_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermissions_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermissions_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermissions_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermissions_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermissions_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getPermissions-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getPermissions-200-schema">
                                  <div id='responses-getPermissions-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ViewPermissionResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getPermissions-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getPermissions-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getPermissions-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getPrivilege">
                      <article id="api-Views-getPrivilege-0" data-group="User" data-name="getPrivilege" data-version="0">
                        <div class="pull-left">
                          <h1>getPrivilege</h1>
                          <p>Get single view instance privilege</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}/privileges/{privilegeId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getPrivilege-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getPrivilege-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getPrivilege-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getPrivilege-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getPrivilege-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getPrivilege-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getPrivilege-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getPrivilege-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getPrivilege-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getPrivilege-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getPrivilege-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getPrivilege-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}/privileges/{privilegeId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getPrivilege-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String privilegeId = privilegeId_example; // String | privilege id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewPrivilegeResponseWrapper result = apiInstance.getPrivilege(viewName, version, instanceName, privilegeId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getPrivilege-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String privilegeId = privilegeId_example; // String | privilege id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewPrivilegeResponseWrapper result = apiInstance.getPrivilege(viewName, version, instanceName, privilegeId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getPrivilege-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getPrivilege-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *instanceName = instanceName_example; // instance name
String *privilegeId = privilegeId_example; // privilege id
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to PrivilegeInfo/*)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get single view instance privilege
[apiInstance getPrivilegeWith:viewName
    version:version
    instanceName:instanceName
    privilegeId:privilegeId
    fields:fields
              completionHandler: ^(ViewPrivilegeResponseWrapper output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivilege-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var instanceName = instanceName_example; // {String} instance name

var privilegeId = privilegeId_example; // {String} privilege id

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getPrivilege(viewName, version, instanceName, privilegeId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getPrivilege-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getPrivilege-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getPrivilegeExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var instanceName = instanceName_example;  // String | instance name
            var privilegeId = privilegeId_example;  // String | privilege id
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to PrivilegeInfo/*)

            try
            {
                // Get single view instance privilege
                ViewPrivilegeResponseWrapper result = apiInstance.getPrivilege(viewName, version, instanceName, privilegeId, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getPrivilege: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivilege-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$instanceName = instanceName_example; // String | instance name
$privilegeId = privilegeId_example; // String | privilege id
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getPrivilege($viewName, $version, $instanceName, $privilegeId, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getPrivilege: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivilege-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $instanceName = instanceName_example; # String | instance name
my $privilegeId = privilegeId_example; # String | privilege id
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getPrivilege(viewName => $viewName, version => $version, instanceName => $instanceName, privilegeId => $privilegeId, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getPrivilege: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivilege-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
instanceName = instanceName_example # String | instance name
privilegeId = privilegeId_example # String | privilege id
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to PrivilegeInfo/*)

try: 
    # Get single view instance privilege
    api_response = api_instance.getPrivilege(viewName, version, instanceName, privilegeId, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getPrivilege: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivilege_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivilege_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivilege_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivilege_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivilege_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivilege_instanceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">privilegeId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "privilegeId",
  "in" : "path",
  "description" : "privilege id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivilege_privilegeId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivilege_privilegeId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivilege_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivilege_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getPrivilege-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getPrivilege-200-schema">
                                  <div id='responses-getPrivilege-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ViewPrivilegeResponseWrapper"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getPrivilege-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getPrivilege-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getPrivilege-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getPrivileges">
                      <article id="api-Views-getPrivileges-0" data-group="User" data-name="getPrivileges" data-version="0">
                        <div class="pull-left">
                          <h1>getPrivileges</h1>
                          <p>Get all view instance privileges</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}/privileges</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getPrivileges-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getPrivileges-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getPrivileges-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getPrivileges-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getPrivileges-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getPrivileges-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getPrivileges-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getPrivileges-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getPrivileges-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getPrivileges-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getPrivileges-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getPrivileges-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}/privileges?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getPrivileges-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewPrivilegeResponseWrapper] result = apiInstance.getPrivileges(viewName, version, instanceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getPrivileges-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewPrivilegeResponseWrapper] result = apiInstance.getPrivileges(viewName, version, instanceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getPrivileges-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getPrivileges-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *instanceName = instanceName_example; // instance name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to PrivilegeInfo/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get all view instance privileges
[apiInstance getPrivilegesWith:viewName
    version:version
    instanceName:instanceName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ViewPrivilegeResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivileges-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var instanceName = instanceName_example; // {String} instance name

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getPrivileges(viewName, version, instanceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getPrivileges-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getPrivileges-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getPrivilegesExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var instanceName = instanceName_example;  // String | instance name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to PrivilegeInfo/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all view instance privileges
                array[ViewPrivilegeResponseWrapper] result = apiInstance.getPrivileges(viewName, version, instanceName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getPrivileges: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivileges-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$instanceName = instanceName_example; // String | instance name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getPrivileges($viewName, $version, $instanceName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getPrivileges: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivileges-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $instanceName = instanceName_example; # String | instance name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getPrivileges(viewName => $viewName, version => $version, instanceName => $instanceName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getPrivileges: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivileges-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
instanceName = instanceName_example # String | instance name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to PrivilegeInfo/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all view instance privileges
    api_response = api_instance.getPrivileges(viewName, version, instanceName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getPrivileges: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_instanceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getPrivileges-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getPrivileges-200-schema">
                                  <div id='responses-getPrivileges-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ViewPrivilegeResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getPrivileges-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getPrivileges-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getPrivileges-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getService">
                      <article id="api-Views-getService-0" data-group="User" data-name="getService" data-version="0">
                        <div class="pull-left">
                          <h1>getService</h1>
                          <p>Get single view instance</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getService-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewInstanceResponse result = apiInstance.getService(viewName, version, instanceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewInstanceResponse result = apiInstance.getService(viewName, version, instanceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // 
String *instanceName = instanceName_example; // instance name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewInstanceInfo/*)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get single view instance
[apiInstance getServiceWith:viewName
    version:version
    instanceName:instanceName
    fields:fields
              completionHandler: ^(ViewInstanceResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} 

var instanceName = instanceName_example; // {String} instance name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getService(viewName, version, instanceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | 
            var instanceName = instanceName_example;  // String | instance name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ViewInstanceInfo/*)

            try
            {
                // Get single view instance
                ViewInstanceResponse result = apiInstance.getService(viewName, version, instanceName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | 
$instanceName = instanceName_example; // String | instance name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getService($viewName, $version, $instanceName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | 
my $instanceName = instanceName_example; # String | instance name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getService(viewName => $viewName, version => $version, instanceName => $instanceName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | 
instanceName = instanceName_example # String | instance name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewInstanceInfo/*)

try: 
    # Get single view instance
    api_response = api_instance.getService(viewName, version, instanceName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getService_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getService_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getService_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getService_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getService_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getService_instanceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ViewInstanceInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getService_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getService_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getService-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getService-200-schema">
                                  <div id='responses-getService-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ViewInstanceResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getService-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getService-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getService-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getServices">
                      <article id="api-Views-getServices-0" data-group="User" data-name="getServices" data-version="0">
                        <div class="pull-left">
                          <h1>getServices</h1>
                          <p>Get all view instances</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions/{version}/instances</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | 
        String version = version_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewInstanceResponse] result = apiInstance.getServices(viewName, version, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | 
        String version = version_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewInstanceResponse] result = apiInstance.getServices(viewName, version, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // 
String *version = version_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewInstanceInfo/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get all view instances
[apiInstance getServicesWith:viewName
    version:version
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ViewInstanceResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} 

var version = version_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getServices(viewName, version, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getServicesExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | 
            var version = version_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ViewInstanceInfo/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all view instances
                array[ViewInstanceResponse] result = apiInstance.getServices(viewName, version, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | 
$version = version_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getServices($viewName, $version, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | 
my $version = version_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getServices(viewName => $viewName, version => $version, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | 
version = version_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewInstanceInfo/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all view instances
    api_response = api_instance.getServices(viewName, version, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServices_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServices_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServices_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServices_version"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ViewInstanceInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServices_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServices_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServices_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServices_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServices_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServices_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServices_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServices_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServices_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServices_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getServices-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getServices-200-schema">
                                  <div id='responses-getServices-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ViewInstanceResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getServices-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getServices-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getServices-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getVersion">
                      <article id="api-Views-getVersion-0" data-group="User" data-name="getVersion" data-version="0">
                        <div class="pull-left">
                          <h1>getVersion</h1>
                          <p>Get single view version</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions/{version}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getVersion-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getVersion-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getVersion-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getVersion-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getVersion-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getVersion-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getVersion-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getVersion-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getVersion-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getVersion-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getVersion-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getVersion-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions/{version}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getVersion-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewVersionResponse result = apiInstance.getVersion(viewName, version, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getVersion");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getVersion-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewVersionResponse result = apiInstance.getVersion(viewName, version, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getVersion");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getVersion-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getVersion-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewVersionInfo/*)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get single view version
[apiInstance getVersionWith:viewName
    version:version
    fields:fields
              completionHandler: ^(ViewVersionResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersion-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getVersion(viewName, version, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getVersion-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getVersion-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getVersionExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ViewVersionInfo/*)

            try
            {
                // Get single view version
                ViewVersionResponse result = apiInstance.getVersion(viewName, version, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getVersion: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersion-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getVersion($viewName, $version, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getVersion: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersion-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getVersion(viewName => $viewName, version => $version, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getVersion: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersion-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewVersionInfo/*)

try: 
    # Get single view version
    api_response = api_instance.getVersion(viewName, version, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getVersion: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersion_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersion_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersion_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersion_version"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ViewVersionInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersion_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersion_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getVersion-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getVersion-200-schema">
                                  <div id='responses-getVersion-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ViewVersionResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getVersion-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getVersion-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getVersion-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getVersions">
                      <article id="api-Views-getVersions-0" data-group="User" data-name="getVersions" data-version="0">
                        <div class="pull-left">
                          <h1>getVersions</h1>
                          <p>Get all versions for a view</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getVersions-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getVersions-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getVersions-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getVersions-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getVersions-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getVersions-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getVersions-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getVersions-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getVersions-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getVersions-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getVersions-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getVersions-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getVersions-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewVersionResponse] result = apiInstance.getVersions(viewName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getVersions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getVersions-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewVersionResponse] result = apiInstance.getVersions(viewName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getVersions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getVersions-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getVersions-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewVersionInfo/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get all versions for a view
[apiInstance getVersionsWith:viewName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ViewVersionResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersions-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getVersions(viewName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getVersions-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getVersions-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getVersionsExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ViewVersionInfo/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all versions for a view
                array[ViewVersionResponse] result = apiInstance.getVersions(viewName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getVersions: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersions-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getVersions($viewName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getVersions: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersions-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getVersions(viewName => $viewName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getVersions: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersions-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewVersionInfo/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all versions for a view
    api_response = api_instance.getVersions(viewName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getVersions: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersions_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersions_viewName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ViewVersionInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersions_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersions_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersions_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersions_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersions_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersions_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersions_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersions_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersions_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersions_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getVersions-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getVersions-200-schema">
                                  <div id='responses-getVersions-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ViewVersionResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getVersions-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getVersions-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getVersions-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getView">
                      <article id="api-Views-getView-0" data-group="User" data-name="getView" data-version="0">
                        <div class="pull-left">
                          <h1>getView</h1>
                          <p>Get single view</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getView-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getView-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getView-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getView-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getView-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getView-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getView-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getView-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getView-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getView-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getView-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getView-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getView-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewResponse result = apiInstance.getView(viewName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getView");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getView-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewResponse result = apiInstance.getView(viewName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getView");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getView-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getView-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Views/*)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get single view
[apiInstance getViewWith:viewName
    fields:fields
              completionHandler: ^(ViewResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getView-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getView(viewName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getView-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getView-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getViewExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Views/*)

            try
            {
                // Get single view
                ViewResponse result = apiInstance.getView(viewName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getView: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getView-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getView($viewName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getView: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getView-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getView(viewName => $viewName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getView: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getView-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Views/*)

try: 
    # Get single view
    api_response = api_instance.getView(viewName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getView: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getView_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getView_viewName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Views/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getView_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getView_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getView-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getView-200-schema">
                                  <div id='responses-getView-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ViewResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getView-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getView-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getView-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getViewUrl">
                      <article id="api-Views-getViewUrl-0" data-group="User" data-name="getViewUrl" data-version="0">
                        <div class="pull-left">
                          <h1>getViewUrl</h1>
                          <p>Get single view URL</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/view/urls/{urlName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getViewUrl-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getViewUrl-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getViewUrl-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getViewUrl-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getViewUrl-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getViewUrl-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getViewUrl-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getViewUrl-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getViewUrl-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getViewUrl-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getViewUrl-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getViewUrl-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/view/urls/{urlName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getViewUrl-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewUrlResponseSwagger result = apiInstance.getViewUrl(urlName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getViewUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getViewUrl-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewUrlResponseSwagger result = apiInstance.getViewUrl(urlName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getViewUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getViewUrl-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getViewUrl-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *urlName = urlName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewUrlInfo/*)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get single view URL
[apiInstance getViewUrlWith:urlName
    fields:fields
              completionHandler: ^(ViewUrlResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrl-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var urlName = urlName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getViewUrl(urlName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getViewUrl-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getViewUrl-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getViewUrlExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var urlName = urlName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ViewUrlInfo/*)

            try
            {
                // Get single view URL
                ViewUrlResponseSwagger result = apiInstance.getViewUrl(urlName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getViewUrl: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrl-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$urlName = urlName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getViewUrl($urlName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getViewUrl: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrl-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $urlName = urlName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getViewUrl(urlName => $urlName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getViewUrl: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrl-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
urlName = urlName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewUrlInfo/*)

try: 
    # Get single view URL
    api_response = api_instance.getViewUrl(urlName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getViewUrl: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">urlName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "urlName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViewUrl_urlName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViewUrl_urlName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ViewUrlInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViewUrl_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViewUrl_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getViewUrl-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getViewUrl-200-schema">
                                  <div id='responses-getViewUrl-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ViewUrlResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getViewUrl-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getViewUrl-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getViewUrl-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getViewUrls">
                      <article id="api-Views-getViewUrls-0" data-group="User" data-name="getViewUrls" data-version="0">
                        <div class="pull-left">
                          <h1>getViewUrls</h1>
                          <p>Get all view URLs</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/view/urls</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getViewUrls-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getViewUrls-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getViewUrls-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getViewUrls-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getViewUrls-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getViewUrls-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getViewUrls-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getViewUrls-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getViewUrls-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getViewUrls-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getViewUrls-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getViewUrls-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/view/urls?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getViewUrls-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewUrlResponseSwagger] result = apiInstance.getViewUrls(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getViewUrls");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getViewUrls-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewUrlResponseSwagger] result = apiInstance.getViewUrls(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getViewUrls");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getViewUrls-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getViewUrls-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewUrlInfo/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get all view URLs
[apiInstance getViewUrlsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ViewUrlResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrls-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getViewUrls(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getViewUrls-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getViewUrls-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getViewUrlsExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ViewUrlInfo/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all view URLs
                array[ViewUrlResponseSwagger] result = apiInstance.getViewUrls(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getViewUrls: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrls-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getViewUrls($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getViewUrls: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrls-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getViewUrls(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getViewUrls: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrls-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewUrlInfo/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all view URLs
    api_response = api_instance.getViewUrls(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getViewUrls: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ViewUrlInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViewUrls_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViewUrls_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViewUrls_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViewUrls_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViewUrls_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViewUrls_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViewUrls_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViewUrls_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViewUrls_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViewUrls_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getViewUrls-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getViewUrls-200-schema">
                                  <div id='responses-getViewUrls-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ViewUrlResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getViewUrls-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getViewUrls-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getViewUrls-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getViews">
                      <article id="api-Views-getViews-0" data-group="User" data-name="getViews" data-version="0">
                        <div class="pull-left">
                          <h1>getViews</h1>
                          <p>Get all views</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns details of all views.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getViews-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getViews-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getViews-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getViews-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getViews-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getViews-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getViews-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getViews-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getViews-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getViews-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getViews-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getViews-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getViews-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewResponse] result = apiInstance.getViews(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getViews");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getViews-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewResponse] result = apiInstance.getViews(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getViews");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getViews-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getViews-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Views/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Views/view_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get all views
[apiInstance getViewsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ViewResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViews-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getViews(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getViews-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getViews-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getViewsExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Views/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Views/view_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all views
                array[ViewResponse] result = apiInstance.getViews(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getViews: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViews-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getViews($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getViews: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViews-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getViews(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getViews: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViews-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Views/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Views/view_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all views
    api_response = api_instance.getViews(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getViews: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Views/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViews_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViews_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Views/view_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViews_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViews_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViews_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViews_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViews_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViews_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViews_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViews_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getViews-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getViews-200-schema">
                                  <div id='responses-getViews-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ViewResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getViews-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getViews-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getViews-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-migrateData">
                      <article id="api-Views-migrateData-0" data-group="User" data-name="migrateData" data-version="0">
                        <div class="pull-left">
                          <h1>migrateData</h1>
                          <p>Migrate view instance data</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Migrates view instance persistence data from origin view instance specified in the path params.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}/migrate/{originVersion}/{originInstanceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-migrateData-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-migrateData-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-migrateData-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-migrateData-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-migrateData-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-migrateData-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-migrateData-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-migrateData-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-migrateData-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-migrateData-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-migrateData-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-migrateData-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}/migrate/{originVersion}/{originInstanceName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-migrateData-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String originVersion = originVersion_example; // String | origin version
        String originInstanceName = originInstanceName_example; // String | origin instance name
        try {
            apiInstance.migrateData(viewName, version, instanceName, originVersion, originInstanceName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#migrateData");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-migrateData-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String originVersion = originVersion_example; // String | origin version
        String originInstanceName = originInstanceName_example; // String | origin instance name
        try {
            apiInstance.migrateData(viewName, version, instanceName, originVersion, originInstanceName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#migrateData");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-migrateData-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-migrateData-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *instanceName = instanceName_example; // instance name
String *originVersion = originVersion_example; // origin version
String *originInstanceName = originInstanceName_example; // origin instance name

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Migrate view instance data
[apiInstance migrateDataWith:viewName
    version:version
    instanceName:instanceName
    originVersion:originVersion
    originInstanceName:originInstanceName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-migrateData-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var instanceName = instanceName_example; // {String} instance name

var originVersion = originVersion_example; // {String} origin version

var originInstanceName = originInstanceName_example; // {String} origin instance name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.migrateData(viewName, version, instanceName, originVersion, originInstanceName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-migrateData-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-migrateData-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class migrateDataExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var instanceName = instanceName_example;  // String | instance name
            var originVersion = originVersion_example;  // String | origin version
            var originInstanceName = originInstanceName_example;  // String | origin instance name

            try
            {
                // Migrate view instance data
                apiInstance.migrateData(viewName, version, instanceName, originVersion, originInstanceName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.migrateData: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-migrateData-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$instanceName = instanceName_example; // String | instance name
$originVersion = originVersion_example; // String | origin version
$originInstanceName = originInstanceName_example; // String | origin instance name

try {
    $api_instance->migrateData($viewName, $version, $instanceName, $originVersion, $originInstanceName);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->migrateData: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-migrateData-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $instanceName = instanceName_example; # String | instance name
my $originVersion = originVersion_example; # String | origin version
my $originInstanceName = originInstanceName_example; # String | origin instance name

eval { 
    $api_instance->migrateData(viewName => $viewName, version => $version, instanceName => $instanceName, originVersion => $originVersion, originInstanceName => $originInstanceName);
};
if ($@) {
    warn "Exception when calling ViewsApi->migrateData: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-migrateData-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
instanceName = instanceName_example # String | instance name
originVersion = originVersion_example # String | origin version
originInstanceName = originInstanceName_example # String | origin instance name

try: 
    # Migrate view instance data
    api_instance.migrateData(viewName, version, instanceName, originVersion, originInstanceName)
except ApiException as e:
    print("Exception when calling ViewsApi->migrateData: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_migrateData_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_migrateData_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_migrateData_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_migrateData_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_migrateData_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_migrateData_instanceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">originVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "originVersion",
  "in" : "path",
  "description" : "origin version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_migrateData_originVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_migrateData_originVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">originInstanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "originInstanceName",
  "in" : "path",
  "description" : "origin instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_migrateData_originInstanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_migrateData_originInstanceName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-updatePrivileges">
                      <article id="api-Views-updatePrivileges-0" data-group="User" data-name="updatePrivileges" data-version="0">
                        <div class="pull-left">
                          <h1>updatePrivileges</h1>
                          <p>Update view instance privilege</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}/privileges</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-updatePrivileges-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-updatePrivileges-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-updatePrivileges-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-updatePrivileges-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-updatePrivileges-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-updatePrivileges-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-updatePrivileges-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-updatePrivileges-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-updatePrivileges-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-updatePrivileges-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-updatePrivileges-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-updatePrivileges-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}/privileges"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-updatePrivileges-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        ViewPrivilegeService body = ; // ViewPrivilegeService | 
        try {
            apiInstance.updatePrivileges(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updatePrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-updatePrivileges-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        ViewPrivilegeService body = ; // ViewPrivilegeService | 
        try {
            apiInstance.updatePrivileges(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updatePrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-updatePrivileges-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-updatePrivileges-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *instanceName = instanceName_example; // instance name
ViewPrivilegeService *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Update view instance privilege
[apiInstance updatePrivilegesWith:viewName
    version:version
    instanceName:instanceName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updatePrivileges-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var instanceName = instanceName_example; // {String} instance name

var opts = { 
  'body':  // {ViewPrivilegeService} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updatePrivileges(viewName, version, instanceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-updatePrivileges-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-updatePrivileges-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updatePrivilegesExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var instanceName = instanceName_example;  // String | instance name
            var body = new ViewPrivilegeService(); // ViewPrivilegeService |  (optional) 

            try
            {
                // Update view instance privilege
                apiInstance.updatePrivileges(viewName, version, instanceName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.updatePrivileges: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updatePrivileges-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$instanceName = instanceName_example; // String | instance name
$body = ; // ViewPrivilegeService | 

try {
    $api_instance->updatePrivileges($viewName, $version, $instanceName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->updatePrivileges: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updatePrivileges-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $instanceName = instanceName_example; # String | instance name
my $body = WWW::SwaggerClient::Object::ViewPrivilegeService->new(); # ViewPrivilegeService | 

eval { 
    $api_instance->updatePrivileges(viewName => $viewName, version => $version, instanceName => $instanceName, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->updatePrivileges: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updatePrivileges-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
instanceName = instanceName_example # String | instance name
body =  # ViewPrivilegeService |  (optional)

try: 
    # Update view instance privilege
    api_instance.updatePrivileges(viewName, version, instanceName, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->updatePrivileges: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updatePrivileges_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updatePrivileges_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updatePrivileges_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updatePrivileges_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updatePrivileges_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updatePrivileges_instanceName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewPrivilegeService"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updatePrivileges_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updatePrivileges_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-updateService">
                      <article id="api-Views-updateService-0" data-group="User" data-name="updateService" data-version="0">
                        <div class="pull-left">
                          <h1>updateService</h1>
                          <p>Update view instance detail</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-updateService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-updateService-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-updateService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-updateService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-updateService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-updateService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-updateService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-updateService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-updateService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-updateService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-updateService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-updateService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-updateService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.updateService(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updateService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-updateService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.updateService(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updateService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-updateService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-updateService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // 
String *instanceName = instanceName_example; // instance name
ViewInstanceResponse *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Update view instance detail
[apiInstance updateServiceWith:viewName
    version:version
    instanceName:instanceName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} 

var instanceName = instanceName_example; // {String} instance name

var opts = { 
  'body':  // {ViewInstanceResponse} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateService(viewName, version, instanceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-updateService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-updateService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | 
            var instanceName = instanceName_example;  // String | instance name
            var body = new ViewInstanceResponse(); // ViewInstanceResponse |  (optional) 

            try
            {
                // Update view instance detail
                apiInstance.updateService(viewName, version, instanceName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.updateService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | 
$instanceName = instanceName_example; // String | instance name
$body = ; // ViewInstanceResponse | 

try {
    $api_instance->updateService($viewName, $version, $instanceName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->updateService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | 
my $instanceName = instanceName_example; # String | instance name
my $body = WWW::SwaggerClient::Object::ViewInstanceResponse->new(); # ViewInstanceResponse | 

eval { 
    $api_instance->updateService(viewName => $viewName, version => $version, instanceName => $instanceName, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->updateService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | 
instanceName = instanceName_example # String | instance name
body =  # ViewInstanceResponse |  (optional)

try: 
    # Update view instance detail
    api_instance.updateService(viewName, version, instanceName, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->updateService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateService_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateService_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateService_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateService_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateService_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateService_instanceName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewInstanceResponse"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateService_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateService_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-updateServices">
                      <article id="api-Views-updateServices-0" data-group="User" data-name="updateServices" data-version="0">
                        <div class="pull-left">
                          <h1>updateServices</h1>
                          <p>Update multiple view instance detail</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/views/{viewName}/versions/{version}/instances</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-updateServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-updateServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-updateServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-updateServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-updateServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-updateServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-updateServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-updateServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-updateServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-updateServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-updateServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-updateServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-updateServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | 
        String version = version_example; // String | 
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.updateServices(viewName, version, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updateServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-updateServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | 
        String version = version_example; // String | 
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.updateServices(viewName, version, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updateServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-updateServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-updateServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // 
String *version = version_example; // 
ViewInstanceResponse *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Update multiple view instance detail
[apiInstance updateServicesWith:viewName
    version:version
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} 

var version = version_example; // {String} 

var opts = { 
  'body':  // {ViewInstanceResponse} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateServices(viewName, version, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-updateServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-updateServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateServicesExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | 
            var version = version_example;  // String | 
            var body = new ViewInstanceResponse(); // ViewInstanceResponse |  (optional) 

            try
            {
                // Update multiple view instance detail
                apiInstance.updateServices(viewName, version, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.updateServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | 
$version = version_example; // String | 
$body = ; // ViewInstanceResponse | 

try {
    $api_instance->updateServices($viewName, $version, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->updateServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | 
my $version = version_example; # String | 
my $body = WWW::SwaggerClient::Object::ViewInstanceResponse->new(); # ViewInstanceResponse | 

eval { 
    $api_instance->updateServices(viewName => $viewName, version => $version, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->updateServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | 
version = version_example # String | 
body =  # ViewInstanceResponse |  (optional)

try: 
    # Update multiple view instance detail
    api_instance.updateServices(viewName, version, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->updateServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateServices_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateServices_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateServices_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateServices_version"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewInstanceResponse"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateServices_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateServices_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-updateUrl">
                      <article id="api-Views-updateUrl-0" data-group="User" data-name="updateUrl" data-version="0">
                        <div class="pull-left">
                          <h1>updateUrl</h1>
                          <p>Update view URL</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/view/urls/{urlName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-updateUrl-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-updateUrl-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-updateUrl-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-updateUrl-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-updateUrl-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-updateUrl-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-updateUrl-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-updateUrl-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-updateUrl-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-updateUrl-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-updateUrl-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-updateUrl-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/view/urls/{urlName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-updateUrl-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        ViewUrlResponseSwagger body = ; // ViewUrlResponseSwagger | 
        try {
            apiInstance.updateUrl(urlName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updateUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-updateUrl-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        ViewUrlResponseSwagger body = ; // ViewUrlResponseSwagger | 
        try {
            apiInstance.updateUrl(urlName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updateUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-updateUrl-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-updateUrl-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *urlName = urlName_example; // 
ViewUrlResponseSwagger *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Update view URL
[apiInstance updateUrlWith:urlName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateUrl-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var urlName = urlName_example; // {String} 

var opts = { 
  'body':  // {ViewUrlResponseSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateUrl(urlName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-updateUrl-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-updateUrl-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateUrlExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var urlName = urlName_example;  // String | 
            var body = new ViewUrlResponseSwagger(); // ViewUrlResponseSwagger |  (optional) 

            try
            {
                // Update view URL
                apiInstance.updateUrl(urlName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.updateUrl: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateUrl-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$urlName = urlName_example; // String | 
$body = ; // ViewUrlResponseSwagger | 

try {
    $api_instance->updateUrl($urlName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->updateUrl: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateUrl-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $urlName = urlName_example; # String | 
my $body = WWW::SwaggerClient::Object::ViewUrlResponseSwagger->new(); # ViewUrlResponseSwagger | 

eval { 
    $api_instance->updateUrl(urlName => $urlName, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->updateUrl: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateUrl-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
urlName = urlName_example # String | 
body =  # ViewUrlResponseSwagger |  (optional)

try: 
    # Update view URL
    api_instance.updateUrl(urlName, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->updateUrl: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">urlName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "urlName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateUrl_urlName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateUrl_urlName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewUrlResponseSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateUrl_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateUrl_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
          </div>
          <div id="footer">
            <div id="api-_footer">
              <p>Suggestions, contact, support and error reporting;
                  <div class="app-desc">Information URL: <a href="https://helloreverb.com">https://helloreverb.com</a></div>
                  <div class="app-desc">Contact Info: <a href="hello@helloreverb.com">hello@helloreverb.com</a></div>
              </p>
                <div class="license-info">Apache License, Version 2.0</div>
                <div class="license-url">http://www.apache.org/licenses/LICENSE-2.0</div>
            </div>
          </div>
          <div id="generator">
            <div class="content">
              Generated 2021-11-02T16:34:34.665+01:00
            </div>
          </div>
      </div>
    </div>
  </div>
  <script>

(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.JSONSchemaView = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
'use strict';
/*
 * Converts anyOf, allOf and oneOf to human readable string
*/
Object.defineProperty(exports, '__esModule', {
  value: true
});
exports.convertXOf = convertXOf;
exports._if = _if;

function convertXOf(type) {
  return type.substring(0, 3) + ' of';
}

/*
 * if condition for ES6 template strings
 * to be used only in template string
 *
 * @example mystr = `Random is ${_if(Math.random() > 0.5)`greater than 0.5``
 *
 * @param {boolean} condition
 *
 * @returns {function} the template function
*/

function _if(condition) {
  return condition ? normal : empty;
}

function empty() {
  return '';
}
function normal(template) {
  for (var _len = arguments.length, expressions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
    expressions[_key - 1] = arguments[_key];
  }

  return template.slice(1).reduce(function (accumulator, part, i) {
    return accumulator + expressions[i] + part;
  }, template[0]);
}

},{}],2:[function(require,module,exports){
'use strict';

/* globals JSONSchemaView */

Object.defineProperty(exports, '__esModule', {
  value: true
});

var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();

var _templateObject = _taggedTemplateLiteral(['\n        <div class="any">\n          ', '\n\n          <span class="type type-any">&lt;any&gt;</span>\n\n          ', '\n\t\t \n\t\t  ', '\n\t\t  ', '\n\t\t   ', '\n        </div>\n      '], ['\n        <div class="any">\n          ', '\n\n          <span class="type type-any">&lt;any&gt;</span>\n\n          ', '\n\t\t \n\t\t  ', '\n\t\t  ', '\n\t\t   ', '\n        </div>\n      ']),
    _templateObject2 = _taggedTemplateLiteral(['\n            <a class="title"><span class="toggle-handle"></span>', ' </a>\n          '], ['\n            <a class="title"><span class="toggle-handle"></span>', ' </a>\n          ']),
    _templateObject3 = _taggedTemplateLiteral(['\n            <div class="inner description marked">', '</div>\n          '], ['\n            <div class="inner description marked">', '</div>\n          ']),
    _templateObject4 = _taggedTemplateLiteral(['\n            <div class="inner required">Required: ', '</div>\n          '], ['\n            <div class="inner required">Required: ', '</div>\n          ']),
    _templateObject5 = _taggedTemplateLiteral(['\n            <div class="inner default">Default: ', '</div>\n          '], ['\n            <div class="inner default">Default: ', '</div>\n          ']),
    _templateObject6 = _taggedTemplateLiteral(['\n            <div class="inner pattern">Pattern: ', '</div>\n          '], ['\n            <div class="inner pattern">Pattern: ', '</div>\n          ']),
    _templateObject7 = _taggedTemplateLiteral(['\n        <div class="primitive">\n          ', '\n\n            <span class="type">', '</span>\n\n         \n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\t\t  \n\t\t \n\t\t  \n\t\t   ', '\n\t\t  ', '\n\t\t   ', '\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n        </div>\n      '], ['\n        <div class="primitive">\n          ', '\n\n            <span class="type">', '</span>\n\n         \n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\t\t  \n\t\t \n\t\t  \n\t\t   ', '\n\t\t  ', '\n\t\t   ', '\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n        </div>\n      ']),
    _templateObject8 = _taggedTemplateLiteral(['\n            <span class="format">(', ')</span>\n          '], ['\n            <span class="format">(', ')</span>\n          ']),
    _templateObject9 = _taggedTemplateLiteral(['\n            <span class="range minimum">minimum:', '</span>\n          '], ['\n            <span class="range minimum">minimum:', '</span>\n          ']),
    _templateObject10 = _taggedTemplateLiteral(['\n            <span class="range exclusiveMinimum">(ex)minimum:', '</span>\n          '], ['\n            <span class="range exclusiveMinimum">(ex)minimum:', '</span>\n          ']),
    _templateObject11 = _taggedTemplateLiteral(['\n            <span class="range maximum">maximum:', '</span>\n          '], ['\n            <span class="range maximum">maximum:', '</span>\n          ']),
    _templateObject12 = _taggedTemplateLiteral(['\n            <span class="range exclusiveMaximum">(ex)maximum:', '</span>\n          '], ['\n            <span class="range exclusiveMaximum">(ex)maximum:', '</span>\n          ']),
    _templateObject13 = _taggedTemplateLiteral(['\n            <span class="range minLength">minLength:', '</span>\n          '], ['\n            <span class="range minLength">minLength:', '</span>\n          ']),
    _templateObject14 = _taggedTemplateLiteral(['\n            <span class="range maxLength">maxLength:', '</span>\n          '], ['\n            <span class="range maxLength">maxLength:', '</span>\n          ']),
    _templateObject15 = _taggedTemplateLiteral(['\n            <div class="inner required">Required</div>\n          '], ['\n            <div class="inner required">Required</div>\n          ']),
    _templateObject16 = _taggedTemplateLiteral(['\n            ', '\n          '], ['\n            ', '\n          ']),
    _templateObject17 = _taggedTemplateLiteral(['', ''], ['', '']),
    _templateObject18 = _taggedTemplateLiteral(['\n        <div class="array">\n          <a class="title"><span class="toggle-handle"></span>', '<span class="opening bracket">[</span>', '</a>\n          ', '\n          <div class="inner">\n            ', '\n          </div>\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n\n          ', '\n        </div>\n      '], ['\n        <div class="array">\n          <a class="title"><span class="toggle-handle"></span>', '<span class="opening bracket">[</span>', '</a>\n          ', '\n          <div class="inner">\n            ', '\n          </div>\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n\n          ', '\n        </div>\n      ']),
    _templateObject19 = _taggedTemplateLiteral(['<span class="closing bracket">]</span>'], ['<span class="closing bracket">]</span>']),
    _templateObject20 = _taggedTemplateLiteral(['\n          <span>\n            <span title="items range">(', '..', ')</span>\n            ', '\n          </span>\n          '], ['\n          <span>\n            <span title="items range">(', '..', ')</span>\n            ', '\n          </span>\n          ']),
    _templateObject21 = _taggedTemplateLiteral(['<span title="unique" class="uniqueItems">♦</span>'], ['<span title="unique" class="uniqueItems">♦</span>']),
    _templateObject22 = _taggedTemplateLiteral(['\n              <div class="description">', '</div>\n            '], ['\n              <div class="description">', '</div>\n            ']),
    _templateObject23 = _taggedTemplateLiteral(['\n          <span class="closing bracket">]</span>\n          '], ['\n          <span class="closing bracket">]</span>\n          ']),
    _templateObject24 = _taggedTemplateLiteral(['\n        <div class="object">\n          <a class="title"><span\n            class="toggle-handle"></span>', ' <span\n            class="opening brace">{</span>', '</a>\n\n          <div class="inner">\n            ', '\n            <!-- children go here -->\n\t\t  \n\t\t   ', '\n\t\t  ', '\n\t\t  \n\t\t\t', '\n          </div>\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n\n          ', '\n        </div>\n      '], ['\n        <div class="object">\n          <a class="title"><span\n            class="toggle-handle"></span>', ' <span\n            class="opening brace">{</span>', '</a>\n\n          <div class="inner">\n            ', '\n            <!-- children go here -->\n\t\t  \n\t\t   ', '\n\t\t  ', '\n\t\t  \n\t\t\t', '\n          </div>\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n\n          ', '\n        </div>\n      ']),
    _templateObject25 = _taggedTemplateLiteral(['\n              <span class="closing brace" ng-if="isCollapsed">}</span>\n          '], ['\n              <span class="closing brace" ng-if="isCollapsed">}</span>\n          ']),
    _templateObject26 = _taggedTemplateLiteral(['\n            <div class="required">Required: ', '</div>\n          '], ['\n            <div class="required">Required: ', '</div>\n          ']),
   _templateObject266 = _taggedTemplateLiteral(['\n            <div class="required">Required: ', '</div>\n          '], ['\n            <div class="required">Required: ', '</div>\n          ']),
    _templateObject27 = _taggedTemplateLiteral(['\n            <div class="default">Default: ', '</div>\n          '], ['\n            <div class="default">Default: ', '</div>\n          ']),
    _templateObject28 = _taggedTemplateLiteral(['\n              <div class="pattern">Pattern: ', '</div>\n            '], ['\n              <div class="pattern">Pattern: ', '</div>\n            ']),
    _templateObject29 = _taggedTemplateLiteral(['\n          <span class="closing brace">}</span>\n          '], ['\n          <span class="closing brace">}</span>\n          ']),
    _templateObject30 = _taggedTemplateLiteral(['\n        <div class="inner enums">\n          <b>Enum:</b>\n        </div>\n      '], ['\n        <div class="inner enums">\n          <b>Enum:</b>\n        </div>\n      ']);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }

function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }

var _helpersJs = require('./helpers.js');

/**
 * @class JSONSchemaView
 *
 * A pure JavaScript component for rendering JSON Schema in HTML.
*/

var JSONSchemaView = (function () {

  /**
   * @param {object} schema The JSON Schema object
   *
   * @param {number} [open=1] his number indicates up to how many levels the
   * rendered tree should expand. Set it to `0` to make the whole tree collapsed
   * or set it to `Infinity` to expand the tree deeply
   * @param {object} options.
   *  theme {string}: one of the following options: ['dark']
  */

  function JSONSchemaView(schema, open) {
    var _this = this;

    var options = arguments.length <= 2 || arguments[2] === undefined ? { theme: null } : arguments[2];

    _classCallCheck(this, JSONSchemaView);

    this.schema = schema; //console.log(schema);
    this.open = open;
    this.options = options;
    this.isCollapsed = open <= 0;

    // if schema is an empty object which means any JOSN
    this.isAny = typeof schema === 'object' && !Array.isArray(schema) && !Object.keys(schema).filter(function (k) {
      return ['title', 'description'].indexOf(k) === -1;
    }).length;

    // Determine if a schema is an array
    this.isArray = !this.isAny && this.schema && this.schema.type === 'array';

    this.isObject = this.schema && (this.schema.type === 'object' || this.schema.properties || this.schema.anyOf || this.schema.oneof || this.schema.allOf);

    // Determine if a schema is a primitive
    this.isPrimitive = !this.isAny && !this.isArray && !this.isObject;

    //
    this.showToggle = this.schema.description || this.schema.title || this.isPrimitive && (this.schema.minimum || this.schema.maximum || this.schema.exclusiveMinimum || this.schema.exclusiveMaximum);

    // populate isRequired property down to properties
    if (this.schema && Array.isArray(this.schema.required)) {
      this.schema.required.forEach(function (requiredProperty) {
        if (typeof _this.schema.properties[requiredProperty] === 'object') {
          _this.schema.properties[requiredProperty].isRequired = true;
        }
      });
    }
  }

  /*
   * Returns the template with populated properties.
   * This template does not have the children
  */

  _createClass(JSONSchemaView, [{
    key: 'template',
    value: function template() {
      if (!this.schema) {
        return '';
      }

      return ('\n      <!-- Any -->\n      ' + (0, _helpersJs._if)(this.isAny)(_templateObject, (0, _helpersJs._if)(this.showToggle)(_templateObject2, this.schema.title || ''), (0, _helpersJs._if)(this.schema.description && !this.isCollapsed)(_templateObject3, marked(this.schema.description || "")), (0, _helpersJs._if)(this.schema.required && !this.isCollapsed)(_templateObject4, this.schema.required), (0, _helpersJs._if)(this.schema['default'] && !this.isCollapsed)(_templateObject5, this.schema['default']), (0, _helpersJs._if)(this.schema.pattern && !this.isCollapsed)(_templateObject6, this.schema.pattern)) + '\n\n      <!-- Primitive -->\n      ' + (0, _helpersJs._if)(this.isPrimitive)(_templateObject7, (0, _helpersJs._if)(this.showToggle)(_templateObject2, this.schema.title || ''), this.schema.type, (0, _helpersJs._if)(!this.isCollapsed && this.schema.format)(_templateObject8, this.schema.format), (0, _helpersJs._if)(!this.isCollapsed && this.schema.minimum)(_templateObject9, this.schema.minimum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.exclusiveMinimum)(_templateObject10, this.schema.exclusiveMinimum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.maximum)(_templateObject11, this.schema.maximum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.exclusiveMaximum)(_templateObject12, this.schema.exclusiveMaximum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.minLength)(_templateObject13, this.schema.minLength), (0, _helpersJs._if)(!this.isCollapsed && this.schema.maxLength)(_templateObject14, this.schema.maxLength), (0, _helpersJs._if)(this.schema.description && !this.isCollapsed)(_templateObject3, marked(this.schema.description || "")), (0, _helpersJs._if)(this.schema.required && !this.isCollapsed)(_templateObject15), (0, _helpersJs._if)(this.schema['default'] && !this.isCollapsed)(_templateObject5, this.schema['default']), (0, _helpersJs._if)(this.schema.pattern && !this.isCollapsed)(_templateObject6, this.schema.pattern), (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject16, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'anyOf'))) + '\n\n\n      <!-- Array -->\n      ' + (0, _helpersJs._if)(this.isArray)(_templateObject18, this.schema.title || '', (0, _helpersJs._if)(this.isCollapsed)(_templateObject19), (0, _helpersJs._if)(!this.isCollapsed && (this.schema.uniqueItems || this.schema.minItems || this.schema.maxItems))(_templateObject20, this.schema.minItems || 0, this.schema.maxItems || '∞', (0, _helpersJs._if)(!this.isCollapsed && this.schema.uniqueItems)(_templateObject21)), (0, _helpersJs._if)(!this.isCollapsed && this.schema.description)(_templateObject22, marked(this.schema.description || "")), (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject16, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'anyOf')), (0, _helpersJs._if)(!this.isCollapsed)(_templateObject23)) + '\n\n      <!-- Object -->\n      ' + (0, _helpersJs._if)(!this.isPrimitive && !this.isArray && !this.isAny)(_templateObject24, this.schema.title || '', (0, _helpersJs._if)(this.isCollapsed)(_templateObject25), (0, _helpersJs._if)(!this.isCollapsed && this.schema.description)(_templateObject22, marked(this.schema.description || "")),

        (0, _helpersJs._if)(this.schema.required && !this.isCollapsed && this.options.isBodyParam != true)(_templateObject26, this.schema.required),
        (0, _helpersJs._if)(this.schema.required && !this.isCollapsed && this.options.isBodyParam == true)(_templateObject266, this.schema.required),

        (0, _helpersJs._if)(this.schema['default'] && !this.isCollapsed)(_templateObject27, this.schema['default']),
        (0, _helpersJs._if)(!this.isCollapsed && this.schema.pattern)(_templateObject28, this.schema.pattern),
        (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject16, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'anyOf')), (0, _helpersJs._if)(!this.isCollapsed)(_templateObject29)) + '\n').replace(/\s*\n/g, '\n').replace(/(\<\!\-\-).+/g, '').trim();
    }

    /*
     * Template for oneOf, anyOf and allOf
    */
  }, {
    key: 'xOf',
    value: function xOf(schema, type) {
      return '\n      <div class="inner ' + type + '">\n        <b>' + (0, _helpersJs.convertXOf)(type) + ':</b>\n      </div>\n    ';
    }

    /*
     * Template for enums
    */
  }, {
    key: 'enum',
    value: function _enum(schema, isCollapsed, open) {
      return '\n      ' + (0, _helpersJs._if)(!isCollapsed && schema['enum'])(_templateObject30) + '\n    ';
    }

    /*
     * Toggles the 'collapsed' state
    */
  }, {
    key: 'toggle',
    value: function toggle() {
      this.isCollapsed = !this.isCollapsed;
      this.render();
    }

    /*
     * Renders the element and returns it
    */
  }, {
    key: 'render',
    value: function render() {
      if (!this.element) {
        this.element = document.createElement('div');
        this.element.classList.add('json-schema-view');
      }

      if (this.isCollapsed) {
        this.element.classList.add('collapsed');
      } else {
        this.element.classList.remove('collapsed');
      }

      if (this.options.theme) {
        this.element.classList.add('json-schema-view-' + this.options.theme);
      }

      this.element.innerHTML = this.template();

      if (!this.schema) {
        return this.element;
      }

      if (!this.isCollapsed) {
        this.appendChildren(this.element);
      }

      // add event listener for toggling
      if (this.element.querySelector('a.title')) {
        this.element.querySelector('a.title').addEventListener('click', this.toggle.bind(this));
      }
      return this.element;
    }

    /*
     * Appends children to given element based on current schema
    */
  }, {
    key: 'appendChildren',
    value: function appendChildren(element) {
      var _this2 = this;

      var inner = element.querySelector('.inner');

      if (!inner) {
        return;
      }

      if (this.schema['enum']) {
        var tempDiv = document.createElement('span');;
        tempDiv.classList.add('inner');
        tempDiv.innerHTML = '<code>' + this.schema['enum'].join('</code>, <code>') + '</code>';
        element.querySelector('.enums.inner').appendChild(tempDiv);
      }

      if (this.isArray) {
        var view = new JSONSchemaView(this.schema.items, this.open - 1);
        inner.appendChild(view.render());
      }

      if (typeof this.schema.properties === 'object') {
        Object.keys(this.schema.properties).forEach(function (propertyName) {
          var property = _this2.schema.properties[propertyName];
          var tempDiv = document.createElement('div');;
          tempDiv.innerHTML = '<div class="property">\n          <span class="name">' + propertyName + ':</span>\n        </div>';
          var view = new JSONSchemaView(property, _this2.open - 1);
          tempDiv.querySelector('.property').appendChild(view.render());

          inner.appendChild(tempDiv.querySelector('.property'));
        });
      }

      if (this.schema.allOf) {
        appendXOf.call(this, 'allOf');
      }
      if (this.schema.oneOf) {
        appendXOf.call(this, 'oneOf');
      }
      if (this.schema.anyOf) {
        appendXOf.call(this, 'anyOf');
      }

      function appendXOf(type) {
        var _this3 = this;

        var innerAllOf = element.querySelector('.inner.' + type);

        this.schema[type].forEach(function (schema) {
          var inner = document.createElement('div');
          inner.classList.add('inner');
          var view = new JSONSchemaView(schema, _this3.open - 1);
          inner.appendChild(view.render());
          innerAllOf.appendChild(inner);
        });
      }
    }
  }]);

  return JSONSchemaView;
})();

exports['default'] = JSONSchemaView;
module.exports = exports['default'];

},{"./helpers.js":1}]},{},[2])(2)
});
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJDOi9Vc2Vycy9qYW1lc2hpL0Rlc2t0b3AvanNvbi1zY2hlbWEtdmlldy1qcy1tYXN0ZXIvc3JjL2hlbHBlcnMuanMiLCJDOi9Vc2Vycy9qYW1lc2hpL0Rlc2t0b3AvanNvbi1zY2hlbWEtdmlldy1qcy1tYXN0ZXIvc3JjL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7O0FBSU4sU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFO0FBQy9CLFNBQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0NBQ3JDOzs7Ozs7Ozs7Ozs7O0FBWU0sU0FBUyxHQUFHLENBQUMsU0FBUyxFQUFFO0FBQzdCLFNBQU8sU0FBUyxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUM7Q0FDbkM7O0FBQ0QsU0FBUyxLQUFLLEdBQUU7QUFDZCxTQUFPLEVBQUUsQ0FBQztDQUNYO0FBQ0QsU0FBUyxNQUFNLENBQUUsUUFBUSxFQUFrQjtvQ0FBYixXQUFXO0FBQVgsZUFBVzs7O0FBQ3ZDLFNBQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBSztBQUN4RCxXQUFPLFdBQVcsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0dBQzVDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDakI7OztBQzVCRCxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt5QkFPTixjQUFjOzs7Ozs7OztJQVFBLGNBQWM7Ozs7Ozs7Ozs7OztBQVd0QixXQVhRLGNBQWMsQ0FXckIsTUFBTSxFQUFFLElBQUksRUFBMkI7OztRQUF6QixPQUFPLHlEQUFHLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQzs7MEJBWDlCLGNBQWM7O0FBWS9CLFFBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3JCLFFBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLFFBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLFFBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQzs7O0FBRzdCLFFBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUNyQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQ3RCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDbkIsTUFBTSxDQUFDLFVBQUEsQ0FBQzthQUFHLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDOzs7QUFHakUsUUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7O0FBRTFFLFFBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQSxBQUFDLENBQUM7OztBQUd0QixRQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDOzs7QUFHbEUsUUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQ2hCLElBQUksQ0FBQyxXQUFXLEtBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFBLEFBQUMsQUFDOUIsQ0FBQzs7O0FBR0osUUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtBQUN0RCxVQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBQSxnQkFBZ0IsRUFBSTtBQUMvQyxZQUFJLE9BQU8sTUFBSyxNQUFNLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEtBQUssUUFBUSxFQUFFO0FBQ2hFLGdCQUFLLE1BQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBQzVEO09BQ0YsQ0FBQyxDQUFDO0tBQ0o7R0FDRjs7Ozs7OztlQXREa0IsY0FBYzs7V0E0RHpCLG9CQUFHO0FBQ1QsVUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDaEIsZUFBTyxFQUFFLENBQUM7T0FDWDs7QUFFRCxhQUFPLGtDQUVILG9CQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBRVgsb0JBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFDa0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxHQUs3RSxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUc5RCxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQ0EsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBRWxFLG9CQUFJLElBQUksQ0FBQyxNQUFNLFdBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQ0QsSUFBSSxDQUFDLE1BQU0sV0FBUSxHQUU5RCxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLDhDQU03RCxvQkFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUVqQixvQkFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUNrQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLEdBR3hELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUlyQyxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUcxQyxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQ1AsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBR3pELG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLG9CQUNILElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEdBRy9FLG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFDUCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FHekQsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsb0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FHL0Usb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLG9CQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUcvRCxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBRy9ELG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBSzdELG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFHL0Msb0JBQUksSUFBSSxDQUFDLE1BQU0sV0FBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFDRCxJQUFJLENBQUMsTUFBTSxXQUFRLEdBRTlELG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FHekQsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLFFBQUssQ0FBQyxvQkFDeEMsSUFBSSxRQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FHckQsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDNUUsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDNUUsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsNENBTWhGLG9CQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBRXVDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBeUMsb0JBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFDekksb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFBLEFBQUMsQ0FBQyxvQkFFdEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLEdBQUcsRUFDcEYsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLHNCQUlqRCxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsb0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUlwRCxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sUUFBSyxDQUFDLG9CQUN4QyxJQUFJLFFBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUdyRCxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUM1RSxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUM1RSxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUU1RSxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsNkRBTzFCLG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUduQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQ3RCLG9CQUFJLElBQUksQ0FBQyxXQUFXLENBQUMscUJBS25ELG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxvQkFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBSXpELG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FFbEUsb0JBQUksSUFBSSxDQUFDLE1BQU0sV0FBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFDUCxJQUFJLENBQUMsTUFBTSxXQUFRLEdBRzFELG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFDSixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FJckQsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLFFBQUssQ0FBQyxvQkFDeEMsSUFBSSxRQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FHckQsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDNUUsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDNUUsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FFNUUsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLDZCQUtoQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDM0Q7Ozs7Ozs7V0FLRSxhQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDaEIsNENBQ3NCLElBQUksdUJBQ2pCLDJCQUFXLElBQUksQ0FBQywrQkFFdkI7S0FDSDs7Ozs7OztXQUtHLGVBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7QUFDOUIsMEJBQ0ksb0JBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxRQUFLLENBQUMsK0JBS2xDO0tBQ0g7Ozs7Ozs7V0FLSyxrQkFBRztBQUNQLFVBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0FBQ3JDLFVBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztLQUNmOzs7Ozs7O1dBS0ssa0JBQUc7QUFDUCxVQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUNqQixZQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0MsWUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7T0FDaEQ7O0FBRUQsVUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQ3BCLFlBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztPQUN6QyxNQUFNO0FBQ0wsWUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO09BQzVDOztBQUVELFVBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDdEIsWUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyx1QkFBcUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUcsQ0FBQztPQUN0RTs7QUFFRCxVQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0FBRXpDLFVBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2hCLGVBQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztPQUNyQjs7QUFFRCxVQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUNyQixZQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztPQUNuQzs7O0FBR0QsVUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRTtBQUN6QyxZQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztPQUN6RjtBQUNELGFBQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztLQUNyQjs7Ozs7OztXQUthLHdCQUFDLE9BQU8sRUFBRTs7O0FBQ3RCLFVBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRTlDLFVBQUksQ0FBQyxLQUFLLEVBQUU7QUFDVixlQUFPO09BQ1I7O0FBRUQsVUFBSSxJQUFJLENBQUMsTUFBTSxRQUFLLEVBQUU7QUFDcEIsWUFBTSxTQUFTLEdBQUcsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sUUFBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckUsWUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3ZDLG1CQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNuQyxlQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztPQUVoRTs7QUFFRCxVQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDaEIsWUFBTSxJQUFJLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUNqRSxhQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO09BQ2xDOztBQUVELFVBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUU7QUFDOUMsY0FBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLFlBQVksRUFBSTtBQUMxRCxjQUFNLFFBQVEsR0FBRyxPQUFLLE1BQU0sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDdEQsY0FBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQy9DLGlCQUFPLENBQUMsU0FBUyw2REFDTSxZQUFZLDZCQUM1QixDQUFDO0FBQ1IsY0FBTSxJQUFJLEdBQUcsSUFBSSxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pELGlCQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQzs7QUFFOUQsZUFBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDdkQsQ0FBQyxDQUFDO09BQ0o7O0FBRUQsVUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtBQUFFLGlCQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztPQUFFO0FBQ3pELFVBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7QUFBRSxpQkFBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7T0FBRTtBQUN6RCxVQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO0FBQUUsaUJBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO09BQUU7O0FBRXpELGVBQVMsU0FBUyxDQUFDLElBQUksRUFBRTs7O0FBQ3ZCLFlBQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxhQUFhLGFBQVcsSUFBSSxDQUFHLENBQUM7O0FBRTNELFlBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsTUFBTSxFQUFJO0FBQ2xDLGNBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUMsZUFBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0IsY0FBTSxJQUFJLEdBQUcsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELGVBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDakMsb0JBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDL0IsQ0FBQyxDQUFDO09BQ0o7S0FDRjs7O1NBOVZrQixjQUFjOzs7cUJBQWQsY0FBYyIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIndXNlIHN0cmljdCc7XG4vKlxuICogQ29udmVydHMgYW55T2YsIGFsbE9mIGFuZCBvbmVPZiB0byBodW1hbiByZWFkYWJsZSBzdHJpbmdcbiovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFhPZih0eXBlKSB7XG4gIHJldHVybiB0eXBlLnN1YnN0cmluZygwLCAzKSArICcgb2YnO1xufVxuXG4vKlxuICogaWYgY29uZGl0aW9uIGZvciBFUzYgdGVtcGxhdGUgc3RyaW5nc1xuICogdG8gYmUgdXNlZCBvbmx5IGluIHRlbXBsYXRlIHN0cmluZ1xuICpcbiAqIEBleGFtcGxlIG15c3RyID0gYFJhbmRvbSBpcyAke19pZihNYXRoLnJhbmRvbSgpID4gMC41KWBncmVhdGVyIHRoYW4gMC41YGBcbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNvbmRpdGlvblxuICpcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gdGhlIHRlbXBsYXRlIGZ1bmN0aW9uXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIF9pZihjb25kaXRpb24pIHtcbiAgcmV0dXJuIGNvbmRpdGlvbiA/IG5vcm1hbCA6IGVtcHR5O1xufVxuZnVuY3Rpb24gZW1wdHkoKXtcbiAgcmV0dXJuICcnO1xufVxuZnVuY3Rpb24gbm9ybWFsICh0ZW1wbGF0ZSwgLi4uZXhwcmVzc2lvbnMpIHtcbiAgcmV0dXJuIHRlbXBsYXRlLnNsaWNlKDEpLnJlZHVjZSgoYWNjdW11bGF0b3IsIHBhcnQsIGkpID0+IHtcbiAgICByZXR1cm4gYWNjdW11bGF0b3IgKyBleHByZXNzaW9uc1tpXSArIHBhcnQ7XG4gIH0sIHRlbXBsYXRlWzBdKTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbHMgSlNPTlNjaGVtYVZpZXcgKi9cblxuaW1wb3J0IHtcbiAgY29udmVydFhPZixcbiAgX2lmXG59IGZyb20gJy4vaGVscGVycy5qcyc7XG5cblxuLyoqXG4gKiBAY2xhc3MgSlNPTlNjaGVtYVZpZXdcbiAqXG4gKiBBIHB1cmUgSmF2YVNjcmlwdCBjb21wb25lbnQgZm9yIHJlbmRlcmluZyBKU09OIFNjaGVtYSBpbiBIVE1MLlxuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpTT05TY2hlbWFWaWV3IHtcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IHNjaGVtYSBUaGUgSlNPTiBTY2hlbWEgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3Blbj0xXSBoaXMgbnVtYmVyIGluZGljYXRlcyB1cCB0byBob3cgbWFueSBsZXZlbHMgdGhlXG4gICAqIHJlbmRlcmVkIHRyZWUgc2hvdWxkIGV4cGFuZC4gU2V0IGl0IHRvIGAwYCB0byBtYWtlIHRoZSB3aG9sZSB0cmVlIGNvbGxhcHNlZFxuICAgKiBvciBzZXQgaXQgdG8gYEluZmluaXR5YCB0byBleHBhbmQgdGhlIHRyZWUgZGVlcGx5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zLlxuICAgKiAgdGhlbWUge3N0cmluZ306IG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6IFsnZGFyayddXG4gICovXG4gIGNvbnN0cnVjdG9yKHNjaGVtYSwgb3Blbiwgb3B0aW9ucyA9IHt0aGVtZTogbnVsbH0pIHtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLm9wZW4gPSBvcGVuO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9IG9wZW4gPD0gMDtcblxuICAgIC8vIGlmIHNjaGVtYSBpcyBhbiBlbXB0eSBvYmplY3Qgd2hpY2ggbWVhbnMgYW55IEpPU05cbiAgICB0aGlzLmlzQW55ID0gdHlwZW9mIHNjaGVtYSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHNjaGVtYSkgJiZcbiAgICAgICFPYmplY3Qua2V5cyhzY2hlbWEpXG4gICAgICAuZmlsdGVyKGs9PiBbJ3RpdGxlJywgJ2Rlc2NyaXB0aW9uJ10uaW5kZXhPZihrKSA9PT0gLTEpLmxlbmd0aDtcblxuICAgIC8vIERldGVybWluZSBpZiBhIHNjaGVtYSBpcyBhbiBhcnJheVxuICAgIHRoaXMuaXNBcnJheSA9ICF0aGlzLmlzQW55ICYmIHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLnR5cGUgPT09ICdhcnJheSc7XG5cbiAgICB0aGlzLmlzT2JqZWN0ID0gdGhpcy5zY2hlbWEgJiZcbiAgICAgICh0aGlzLnNjaGVtYS50eXBlID09PSAnb2JqZWN0JyB8fFxuICAgICAgIHRoaXMuc2NoZW1hLnByb3BlcnRpZXMgfHxcbiAgICAgICB0aGlzLnNjaGVtYS5hbnlPZiB8fFxuICAgICAgIHRoaXMuc2NoZW1hLm9uZW9mIHx8XG4gICAgICAgdGhpcy5zY2hlbWEuYWxsT2YpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIGEgc2NoZW1hIGlzIGEgcHJpbWl0aXZlXG4gICAgdGhpcy5pc1ByaW1pdGl2ZSA9ICF0aGlzLmlzQW55ICYmICF0aGlzLmlzQXJyYXkgJiYgIXRoaXMuaXNPYmplY3Q7XG5cbiAgICAvL1xuICAgIHRoaXMuc2hvd1RvZ2dsZSA9IHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uIHx8XG4gICAgICB0aGlzLnNjaGVtYS50aXRsZSB8fFxuICAgICAgKHRoaXMuaXNQcmltaXRpdmUgJiYgKFxuICAgICAgICB0aGlzLnNjaGVtYS5taW5pbXVtIHx8XG4gICAgICAgIHRoaXMuc2NoZW1hLm1heGltdW0gfHxcbiAgICAgICAgdGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSB8fFxuICAgICAgICB0aGlzLnNjaGVtYS5leGNsdXNpdmVNYXhpbXVtKVxuICAgICAgKTtcblxuICAgIC8vIHBvcHVsYXRlIGlzUmVxdWlyZWQgcHJvcGVydHkgZG93biB0byBwcm9wZXJ0aWVzXG4gICAgaWYgKHRoaXMuc2NoZW1hICYmIEFycmF5LmlzQXJyYXkodGhpcy5zY2hlbWEucmVxdWlyZWQpKSB7XG4gICAgICB0aGlzLnNjaGVtYS5yZXF1aXJlZC5mb3JFYWNoKHJlcXVpcmVkUHJvcGVydHkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcmVxdWlyZWRQcm9wZXJ0eV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy5zY2hlbWEucHJvcGVydGllc1tyZXF1aXJlZFByb3BlcnR5XS5pc1JlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgd2l0aCBwb3B1bGF0ZWQgcHJvcGVydGllcy5cbiAgICogVGhpcyB0ZW1wbGF0ZSBkb2VzIG5vdCBoYXZlIHRoZSBjaGlsZHJlblxuICAqL1xuICB0ZW1wbGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuc2NoZW1hKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIDwhLS0gQW55IC0tPlxuICAgICAgJHtfaWYodGhpcy5pc0FueSlgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbnlcIj5cbiAgICAgICAgICAke19pZih0aGlzLnNob3dUb2dnbGUpYFxuICAgICAgICAgICAgPGEgY2xhc3M9XCJ0aXRsZVwiPjxzcGFuIGNsYXNzPVwidG9nZ2xlLWhhbmRsZVwiPjwvc3Bhbj4ke3RoaXMuc2NoZW1hLnRpdGxlIHx8ICcnfSA8L2E+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHlwZSB0eXBlLWFueVwiPiZsdDthbnkmZ3Q7PC9zcGFuPlxuXG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuZGVzY3JpcHRpb24gJiYgIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIGRlc2NyaXB0aW9uXCI+JHt0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbn08L2Rpdj5cbiAgICAgICAgICBgfVxuXHRcdCBcblx0XHQgICR7X2lmKHRoaXMuc2NoZW1hLnJlcXVpcmVkICYmICF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lciByZXF1aXJlZFwiPlJlcXVpcmVkOiAke3RoaXMuc2NoZW1hLnJlcXVpcmVkfTwvZGl2PlxuICAgICAgICAgIGB9XG5cdFx0ICAke19pZih0aGlzLnNjaGVtYS5kZWZhdWx0ICYmICF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lciBkZWZhdWx0XCI+RGVmYXVsdDogJHt0aGlzLnNjaGVtYS5kZWZhdWx0fTwvZGl2PlxuICAgICAgICAgIGB9XG5cdFx0ICAgJHtfaWYodGhpcy5zY2hlbWEucGF0dGVybiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5uZXIgcGF0dGVyblwiPlBhdHRlcm46ICR7dGhpcy5zY2hlbWEucGF0dGVybn08L2Rpdj5cbiAgICAgICAgICBgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGB9XG5cbiAgICAgIDwhLS0gUHJpbWl0aXZlIC0tPlxuICAgICAgJHtfaWYodGhpcy5pc1ByaW1pdGl2ZSlgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmltaXRpdmVcIj5cbiAgICAgICAgICAke19pZih0aGlzLnNob3dUb2dnbGUpYFxuICAgICAgICAgICAgPGEgY2xhc3M9XCJ0aXRsZVwiPjxzcGFuIGNsYXNzPVwidG9nZ2xlLWhhbmRsZVwiPjwvc3Bhbj4ke3RoaXMuc2NoZW1hLnRpdGxlIHx8ICcnfSA8L2E+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0eXBlXCI+JHt0aGlzLnNjaGVtYS50eXBlfTwvc3Bhbj5cblxuICAgICAgICAgXG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5mb3JtYXQpYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtYXRcIj4oJHt0aGlzLnNjaGVtYS5mb3JtYXR9KTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWluaW11bSlgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhbmdlIG1pbmltdW1cIj5taW5pbXVtOiR7dGhpcy5zY2hlbWEubWluaW11bX08L3NwYW4+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYW5nZSBleGNsdXNpdmVNaW5pbXVtXCI+KGV4KW1pbmltdW06JHt0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtfTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWF4aW11bSlgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhbmdlIG1heGltdW1cIj5tYXhpbXVtOiR7dGhpcy5zY2hlbWEubWF4aW11bX08L3NwYW4+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYW5nZSBleGNsdXNpdmVNYXhpbXVtXCI+KGV4KW1heGltdW06JHt0aGlzLnNjaGVtYS5leGNsdXNpdmVNYXhpbXVtfTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWluTGVuZ3RoKWBcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmFuZ2UgbWluTGVuZ3RoXCI+bWluTGVuZ3RoOiR7dGhpcy5zY2hlbWEubWluTGVuZ3RofTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWF4TGVuZ3RoKWBcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmFuZ2UgbWF4TGVuZ3RoXCI+bWF4TGVuZ3RoOiR7dGhpcy5zY2hlbWEubWF4TGVuZ3RofTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuZGVzY3JpcHRpb24gJiYgIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIGRlc2NyaXB0aW9uXCI+JHt0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbn08L2Rpdj5cbiAgICAgICAgICBgfVxuXHRcdCAgXG5cdFx0IFxuXHRcdCAgXG5cdFx0ICAgJHtfaWYodGhpcy5zY2hlbWEucmVxdWlyZWQgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIHJlcXVpcmVkXCI+UmVxdWlyZWQ8L2Rpdj5cbiAgICAgICAgICBgfVxuXHRcdCAgJHtfaWYodGhpcy5zY2hlbWEuZGVmYXVsdCAmJiAhdGhpcy5pc0NvbGxhcHNlZClgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5uZXIgZGVmYXVsdFwiPkRlZmF1bHQ6ICR7dGhpcy5zY2hlbWEuZGVmYXVsdH08L2Rpdj5cbiAgICAgICAgICBgfVxuXHRcdCAgICR7X2lmKHRoaXMuc2NoZW1hLnBhdHRlcm4gJiYgIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIHBhdHRlcm5cIj5QYXR0ZXJuOiAke3RoaXMuc2NoZW1hLnBhdHRlcm59PC9kaXY+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmVudW0pYFxuICAgICAgICAgICAgJHt0aGlzLmVudW0odGhpcy5zY2hlbWEsIHRoaXMuaXNDb2xsYXBzZWQsIHRoaXMub3Blbil9XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLmFsbE9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnYWxsT2YnKX1gfVxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLm9uZU9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnb25lT2YnKX1gfVxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLmFueU9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnYW55T2YnKX1gfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGB9XG5cblxuICAgICAgPCEtLSBBcnJheSAtLT5cbiAgICAgICR7X2lmKHRoaXMuaXNBcnJheSlgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcnJheVwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwidGl0bGVcIj48c3BhbiBjbGFzcz1cInRvZ2dsZS1oYW5kbGVcIj48L3NwYW4+JHt0aGlzLnNjaGVtYS50aXRsZSB8fCAnJ308c3BhbiBjbGFzcz1cIm9wZW5pbmcgYnJhY2tldFwiPls8L3NwYW4+JHtfaWYodGhpcy5pc0NvbGxhcHNlZClgPHNwYW4gY2xhc3M9XCJjbG9zaW5nIGJyYWNrZXRcIj5dPC9zcGFuPmB9PC9hPlxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmICh0aGlzLnNjaGVtYS51bmlxdWVJdGVtcyB8fCB0aGlzLnNjaGVtYS5taW5JdGVtcyB8fCB0aGlzLnNjaGVtYS5tYXhJdGVtcykpYFxuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgPHNwYW4gdGl0bGU9XCJpdGVtcyByYW5nZVwiPigke3RoaXMuc2NoZW1hLm1pbkl0ZW1zIHx8IDB9Li4ke3RoaXMuc2NoZW1hLm1heEl0ZW1zIHx8ICfiiJ4nfSk8L3NwYW4+XG4gICAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS51bmlxdWVJdGVtcylgPHNwYW4gdGl0bGU9XCJ1bmlxdWVcIiBjbGFzcz1cInVuaXF1ZUl0ZW1zXCI+4pmmPC9zcGFuPmB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIGB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyXCI+XG4gICAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbilgXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPiR7dGhpcy5zY2hlbWEuZGVzY3JpcHRpb259PC9kaXY+XG4gICAgICAgICAgICBgfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEuZW51bSlgXG4gICAgICAgICAgICAke3RoaXMuZW51bSh0aGlzLnNjaGVtYSwgdGhpcy5pc0NvbGxhcHNlZCwgdGhpcy5vcGVuKX1cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuYWxsT2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdhbGxPZicpfWB9XG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEub25lT2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdvbmVPZicpfWB9XG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuYW55T2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdhbnlPZicpfWB9XG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZClgXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjbG9zaW5nIGJyYWNrZXRcIj5dPC9zcGFuPlxuICAgICAgICAgIGB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgYH1cblxuICAgICAgPCEtLSBPYmplY3QgLS0+XG4gICAgICAke19pZighdGhpcy5pc1ByaW1pdGl2ZSAmJiAhdGhpcy5pc0FycmF5ICYmICF0aGlzLmlzQW55KWBcbiAgICAgICAgPGRpdiBjbGFzcz1cIm9iamVjdFwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwidGl0bGVcIj48c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtaGFuZGxlXCI+PC9zcGFuPiR7dGhpcy5zY2hlbWEudGl0bGUgfHwgJyd9IDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cIm9wZW5pbmcgYnJhY2VcIj57PC9zcGFuPiR7X2lmKHRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsb3NpbmcgYnJhY2VcIiBuZy1pZj1cImlzQ29sbGFwc2VkXCI+fTwvc3Bhbj5cbiAgICAgICAgICBgfTwvYT5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lclwiPlxuICAgICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEuZGVzY3JpcHRpb24pYFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIj4ke3RoaXMuc2NoZW1hLmRlc2NyaXB0aW9ufTwvZGl2PlxuICAgICAgICAgICAgYH1cbiAgICAgICAgICAgIDwhLS0gY2hpbGRyZW4gZ28gaGVyZSAtLT5cblx0XHQgIFxuXHRcdCAgICR7X2lmKHRoaXMuc2NoZW1hLnJlcXVpcmVkICYmICF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXF1aXJlZFwiPkRlZmF1bHQgRmllbGRzOiAke3RoaXMuc2NoZW1hLnJlcXVpcmVkfTwvZGl2PlxuICAgICAgICAgIGB9XG5cdFx0ICAke19pZih0aGlzLnNjaGVtYS5kZWZhdWx0ICYmICF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZWZhdWx0XCI+RGVmYXVsdDogJHt0aGlzLnNjaGVtYS5kZWZhdWx0fTwvZGl2PlxuICAgICAgICAgIGB9XG5cdFx0ICBcblx0XHRcdCR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLnBhdHRlcm4pYFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGF0dGVyblwiPlBhdHRlcm46ICR7dGhpcy5zY2hlbWEucGF0dGVybn08L2Rpdj5cbiAgICAgICAgICAgIGB9XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5lbnVtKWBcbiAgICAgICAgICAgICR7dGhpcy5lbnVtKHRoaXMuc2NoZW1hLCB0aGlzLmlzQ29sbGFwc2VkLCB0aGlzLm9wZW4pfVxuICAgICAgICAgIGB9XG5cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5hbGxPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ2FsbE9mJyl9YH1cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5vbmVPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ29uZU9mJyl9YH1cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5hbnlPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ2FueU9mJyl9YH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsb3NpbmcgYnJhY2VcIj59PC9zcGFuPlxuICAgICAgICAgIGB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgYH1cbmAucmVwbGFjZSgvXFxzKlxcbi9nLCAnXFxuJykucmVwbGFjZSgvKFxcPFxcIVxcLVxcLSkuKy9nLCAnJykudHJpbSgpO1xuICB9XG5cbiAgLypcbiAgICogVGVtcGxhdGUgZm9yIG9uZU9mLCBhbnlPZiBhbmQgYWxsT2ZcbiAgKi9cbiAgeE9mKHNjaGVtYSwgdHlwZSkge1xuICAgIHJldHVybiBgXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5uZXIgJHt0eXBlfVwiPlxuICAgICAgICA8Yj4ke2NvbnZlcnRYT2YodHlwZSl9OjwvYj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICAvKlxuICAgKiBUZW1wbGF0ZSBmb3IgZW51bXNcbiAgKi9cbiAgZW51bShzY2hlbWEsIGlzQ29sbGFwc2VkLCBvcGVuKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgICR7X2lmKCFpc0NvbGxhcHNlZCAmJiBzY2hlbWEuZW51bSlgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lciBlbnVtc1wiPlxuICAgICAgICAgIDxiPkVudW06PC9iPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGB9XG4gICAgYDtcbiAgfVxuXG4gIC8qXG4gICAqIFRvZ2dsZXMgdGhlICdjb2xsYXBzZWQnIHN0YXRlXG4gICovXG4gIHRvZ2dsZSgpIHtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gIXRoaXMuaXNDb2xsYXBzZWQ7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qXG4gICAqIFJlbmRlcnMgdGhlIGVsZW1lbnQgYW5kIHJldHVybnMgaXRcbiAgKi9cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdqc29uLXNjaGVtYS12aWV3Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2NvbGxhcHNlZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGhlbWUpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKGBqc29uLXNjaGVtYS12aWV3LSR7dGhpcy5vcHRpb25zLnRoZW1lfWApO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLnRlbXBsYXRlKCk7XG5cbiAgICBpZiAoIXRoaXMuc2NoZW1hKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc0NvbGxhcHNlZCkge1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZHJlbih0aGlzLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8vIGFkZCBldmVudCBsaXN0ZW5lciBmb3IgdG9nZ2xpbmdcbiAgICBpZiAodGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EudGl0bGUnKSkge1xuICAgICAgdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EudGl0bGUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMudG9nZ2xlLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbGVtZW50O1xuICB9XG5cbiAgLypcbiAgICogQXBwZW5kcyBjaGlsZHJlbiB0byBnaXZlbiBlbGVtZW50IGJhc2VkIG9uIGN1cnJlbnQgc2NoZW1hXG4gICovXG4gIGFwcGVuZENoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbm5lciA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmlubmVyJyk7XG5cbiAgICBpZiAoIWlubmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2NoZW1hLmVudW0pIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBKU09ORm9ybWF0dGVyKHRoaXMuc2NoZW1hLmVudW0sIHRoaXMub3BlbiAtIDEpO1xuICAgICAgY29uc3QgZm9ybWF0dGVyRWwgPSBmb3JtYXR0ZXIucmVuZGVyKCk7XG4gICAgICBmb3JtYXR0ZXJFbC5jbGFzc0xpc3QuYWRkKCdpbm5lcicpO1xuICAgICAgZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZW51bXMuaW5uZXInKS5hcHBlbmRDaGlsZChmb3JtYXR0ZXJFbCk7XG5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0FycmF5KSB7XG4gICAgICBjb25zdCB2aWV3ID0gbmV3IEpTT05TY2hlbWFWaWV3KHRoaXMuc2NoZW1hLml0ZW1zLCB0aGlzLm9wZW4gLSAxKVxuICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQodmlldy5yZW5kZXIoKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzID09PSAnb2JqZWN0Jykge1xuICAgICAgT2JqZWN0LmtleXModGhpcy5zY2hlbWEucHJvcGVydGllcykuZm9yRWFjaChwcm9wZXJ0eU5hbWUgPT4ge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOztcbiAgICAgICAgdGVtcERpdi5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInByb3BlcnR5XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYW1lXCI+JHtwcm9wZXJ0eU5hbWV9Ojwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBKU09OU2NoZW1hVmlldyhwcm9wZXJ0eSwgdGhpcy5vcGVuIC0gMSk7XG4gICAgICAgIHRlbXBEaXYucXVlcnlTZWxlY3RvcignLnByb3BlcnR5JykuYXBwZW5kQ2hpbGQodmlldy5yZW5kZXIoKSk7XG5cbiAgICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQodGVtcERpdi5xdWVyeVNlbGVjdG9yKCcucHJvcGVydHknKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY2hlbWEuYWxsT2YpIHsgYXBwZW5kWE9mLmNhbGwodGhpcywgJ2FsbE9mJyk7IH1cbiAgICBpZiAodGhpcy5zY2hlbWEub25lT2YpIHsgYXBwZW5kWE9mLmNhbGwodGhpcywgJ29uZU9mJyk7IH1cbiAgICBpZiAodGhpcy5zY2hlbWEuYW55T2YpIHsgYXBwZW5kWE9mLmNhbGwodGhpcywgJ2FueU9mJyk7IH1cblxuICAgIGZ1bmN0aW9uIGFwcGVuZFhPZih0eXBlKSB7XG4gICAgICBjb25zdCBpbm5lckFsbE9mID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKGAuaW5uZXIuJHt0eXBlfWApO1xuXG4gICAgICB0aGlzLnNjaGVtYVt0eXBlXS5mb3JFYWNoKHNjaGVtYSA9PiB7XG4gICAgICAgIGNvbnN0IGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGlubmVyLmNsYXNzTGlzdC5hZGQoJ2lubmVyJyk7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgSlNPTlNjaGVtYVZpZXcoc2NoZW1hLCB0aGlzLm9wZW4gLSAxKTtcbiAgICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQodmlldy5yZW5kZXIoKSk7XG4gICAgICAgIGlubmVyQWxsT2YuYXBwZW5kQ2hpbGQoaW5uZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=

</script>

  <script>
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.JsonRefs=t()}}(function(){var t;return function e(t,n,r){function o(s,u){if(!n[s]){if(!t[s]){var a="function"==typeof require&&require;if(!u&&a)return a(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var f=n[s]={exports:{}};t[s][0].call(f.exports,function(e){var n=t[s][1][e];return o(n?n:e)},f,f.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s<r.length;s++)o(r[s]);return o}({1:[function(t,e,n){"use strict";function r(t,e){var n=p[t],r=Promise.resolve(),o=-1===t.indexOf(":")?void 0:t.split(":")[0];return a.isUndefined(n)?-1!==h.indexOf(o)||a.isUndefined(o)?(r=c.load(t,e),r=r.then(e.processContent?function(n){return e.processContent(n,t)}:JSON.parse),r=r.then(function(e){return p[t]=e,e})):r=r.then(function(){return Promise.reject(new Error("Unsupported remote reference scheme: "+o))}):r=r.then(function(){return n}),r=r.then(function(t){return a.cloneDeep(t)})}function o(t,e){var n=m(t);return v(e)&&(e=-1===e.indexOf("#")?"#":e.substring(e.indexOf("#"))),d(n.concat(m(e))).replace(/\/\$ref/g,"")}function i(t,e){function n(t){".."===t?o.pop():"."!==t&&o.push(t)}var r="#"!==e.charAt(0)&&-1===e.indexOf(":"),o=[],i=(e.indexOf("#")>-1?e.split("#")[0]:e).split("/");return t&&(t.indexOf("#")>-1&&(t=t.substring(0,t.indexOf("#"))),t.length>1&&"/"===t[t.length-1]&&(t=t.substring(0,t.length-1)),t.split("#")[0].split("/").forEach(n)),r?i.forEach(n):o=i,o.join("/")}function s(t,e,n){function r(t){var e=t.slice(0,t.lastIndexOf("allOf")),o=n[d(e)];return a.isUndefined(o)?e.indexOf("allOf")>-1?r(e):void 0:d(e)}function i(t){var e=[],o=t.map(function(){var t,o=d(this.path),i=n[o];this.circular&&(e.push(o),a.isUndefined(i)&&(t=r(this.path),i=n[t]),a.isUndefined(i)||(i.circular=!0),this.update(0===u?{}:f(this.node).map(function(){this.circular&&this.parent.update({})})))});return a.each(e,function(t){var e,n=[],r=m(t),i=f(o).get(r);for(e=0;u>e;e++)n.push.apply(n,r),f(o).set(n,a.cloneDeep(i))}),o}function s(t,e){var r=o(e,"#"),i=t=-1===t.indexOf("#")?"#":t.substring(t.indexOf("#")),s=m(i),u=!c.has(s),a=c.get(s),f=m(e),p=f.slice(0,f.length-1),h=n[r]||{ref:t};u?h.missing=!0:0===p.length?(c.value===a&&(a={},h.circular=!0),c.value=a):(c.get(p)===a&&(a={},h.circular=!0),c.set(p,a)),n[r]=h}var u=a.isUndefined(e.depth)?1:e.depth,c=f(t);return a.each(y(t),function(t,e){v(t)||s(t,e)}),a.isUndefined(e.location)||a.each(n,function(t){var n=t.ref;0===n.indexOf(e.location)&&(n=n.substring(e.location.length),"/"===n.charAt(0)&&(n=n.substring(1))),t.ref=n}),{metadata:n,resolved:i(c)}}function u(t,e,n,c,p){function h(t,e,r,i,s){var u,h=r+("#"===i?"":i),l=o(n,t),d=p[l]||{},y=m(t);a.isUndefined(s)?(d.circular=!0,u=c[r].ref):(u=f(s).get(m(i)),a.isUndefined(u)?d.missing=!0:u.$ref?u=u.$ref:y.pop()),0===y.length?g.value=u:g.set(y,u),d.ref=h,p[l]=d}function l(){return{metadata:p,resolved:g.value}}var d=Promise.resolve(),g=f(t);return a.each(y(t),function(t,s){v(t)&&(d=d.then(function(){var f=i(e.location,t),l=t.split("#"),d="#"+(l[1]||"");return a.isUndefined(c[f])?r(f,e).then(function(t){return t},function(t){return t}).then(function(r){var y=l[0],v=a.cloneDeep(e),m=o(n,s);return y=y.substring(0,y.lastIndexOf("/")+1),v.location=i(e.location,y),a.isError(r)?void(p[m]={err:r,missing:!0,ref:t}):(c[f]={ref:n},u(r,v,m,c,p).then(function(e){return delete c[f],h(s,t,f,d,e.resolved),e}))}):void h(s,t,f,d)}))}),d=d.then(function(){s(g.value,e,p)}).then(l,l)}"undefined"==typeof Promise&&t("native-promise-only");var a=t("./lib/utils"),c=t("path-loader"),f=t("traverse"),p={},h=["file","http","https"];e.exports.clearCache=function(){p={}};var l=e.exports.isJsonReference=function(t){return a.isPlainObject(t)&&a.isString(t.$ref)},d=e.exports.pathToPointer=function(t){if(a.isUndefined(t))throw new Error("path is required");if(!a.isArray(t))throw new Error("path must be an array");var e="#";return t.length>0&&(e+="/"+t.map(function(t){return t.replace(/~/g,"~0").replace(/\//g,"~1")}).join("/")),e},y=e.exports.findRefs=function(t){if(a.isUndefined(t))throw new Error("json is required");if(!a.isPlainObject(t))throw new Error("json must be an object");return f(t).reduce(function(t){var e=this.node;return"$ref"===this.key&&l(this.parent.node)&&(t[d(this.path)]=e),t},{})},v=e.exports.isRemotePointer=function(t){if(a.isUndefined(t))throw new Error("ptr is required");if(!a.isString(t))throw new Error("ptr must be a string");return""!==t&&"#"!==t.charAt(0)},m=e.exports.pathFromPointer=function(t){if(a.isUndefined(t))throw new Error("ptr is required");if(!a.isString(t))throw new Error("ptr must be a string");var e=[],n=["","#","#/"];return v(t)?e=t:-1===n.indexOf(t)&&"#"===t.charAt(0)&&(e=t.substring(t.indexOf("/")).split("/").reduce(function(t,e){return""!==e&&t.push(e.replace(/~0/g,"~").replace(/~1/g,"/")),t},[])),e};e.exports.resolveRefs=function(t,e,n){var r=Promise.resolve();return 2===arguments.length&&a.isFunction(e)&&(n=e,e={}),a.isUndefined(e)&&(e={}),r=r.then(function(){if(a.isUndefined(t))throw new Error("json is required");if(!a.isPlainObject(t))throw new Error("json must be an object");if(!a.isPlainObject(e))throw new Error("options must be an object");if(!a.isUndefined(n)&&!a.isFunction(n))throw new Error("done must be a function");if(!a.isUndefined(e.processContent)&&!a.isFunction(e.processContent))throw new Error("options.processContent must be a function");if(!a.isUndefined(e.prepareRequest)&&!a.isFunction(e.prepareRequest))throw new Error("options.prepareRequest must be a function");if(!a.isUndefined(e.location)&&!a.isString(e.location))throw new Error("options.location must be a string");if(!a.isUndefined(e.depth)&&!a.isNumber(e.depth))throw new Error("options.depth must be a number");if(!a.isUndefined(e.depth)&&e.depth<0)throw new Error("options.depth must be greater or equal to zero")}),t=f(t).clone(),e=f(e).clone(),r=r.then(function(){return u(t,e,"#",{},{})}).then(function(t){return s(t.resolved,e,t.metadata)}),!a.isUndefined(n)&&a.isFunction(n)&&(r=r.then(function(t){n(void 0,t.resolved,t.metadata)},function(t){n(t)})),r}},{"./lib/utils":2,"native-promise-only":3,"path-loader":4,traverse:10}],2:[function(t,e,n){"use strict";function r(t,e){return Object.prototype.toString.call(t)==="[object "+e+"]"}var o=t("traverse");e.exports.cloneDeep=function(t){return o(t).clone()};var i=e.exports.isArray=function(t){return r(t,"Array")};e.exports.isError=function(t){return r(t,"Error")},e.exports.isFunction=function(t){return r(t,"Function")},e.exports.isNumber=function(t){return r(t,"Number")};var s=e.exports.isPlainObject=function(t){return r(t,"Object")};e.exports.isString=function(t){return r(t,"String")},e.exports.isUndefined=function(t){return"undefined"==typeof t},e.exports.each=function(t,e){i(t)?t.forEach(e):s(t)&&Object.keys(t).forEach(function(n){e(t[n],n)})}},{traverse:10}],3:[function(e,n,r){(function(e){!function(e,r,o){r[e]=r[e]||o(),"undefined"!=typeof n&&n.exports?n.exports=r[e]:"function"==typeof t&&t.amd&&t(function(){return r[e]})}("Promise","undefined"!=typeof e?e:this,function(){"use strict";function t(t,e){h.add(t,e),p||(p=d(h.drain))}function e(t){var e,n=typeof t;return null==t||"object"!=n&&"function"!=n||(e=t.then),"function"==typeof e?e:!1}function n(){for(var t=0;t<this.chain.length;t++)r(this,1===this.state?this.chain[t].success:this.chain[t].failure,this.chain[t]);this.chain.length=0}function r(t,n,r){var o,i;try{n===!1?r.reject(t.msg):(o=n===!0?t.msg:n.call(void 0,t.msg),o===r.promise?r.reject(TypeError("Promise-chain cycle")):(i=e(o))?i.call(o,r.resolve,r.reject):r.resolve(o))}catch(s){r.reject(s)}}function o(r){var s,a=this;if(!a.triggered){a.triggered=!0,a.def&&(a=a.def);try{(s=e(r))?t(function(){var t=new u(a);try{s.call(r,function(){o.apply(t,arguments)},function(){i.apply(t,arguments)})}catch(e){i.call(t,e)}}):(a.msg=r,a.state=1,a.chain.length>0&&t(n,a))}catch(c){i.call(new u(a),c)}}}function i(e){var r=this;r.triggered||(r.triggered=!0,r.def&&(r=r.def),r.msg=e,r.state=2,r.chain.length>0&&t(n,r))}function s(t,e,n,r){for(var o=0;o<e.length;o++)!function(o){t.resolve(e[o]).then(function(t){n(o,t)},r)}(o)}function u(t){this.def=t,this.triggered=!1}function a(t){this.promise=t,this.state=0,this.triggered=!1,this.chain=[],this.msg=void 0}function c(e){if("function"!=typeof e)throw TypeError("Not a function");if(0!==this.__NPO__)throw TypeError("Not a promise");this.__NPO__=1;var r=new a(this);this.then=function(e,o){var i={success:"function"==typeof e?e:!0,failure:"function"==typeof o?o:!1};return i.promise=new this.constructor(function(t,e){if("function"!=typeof t||"function"!=typeof e)throw TypeError("Not a function");i.resolve=t,i.reject=e}),r.chain.push(i),0!==r.state&&t(n,r),i.promise},this["catch"]=function(t){return this.then(void 0,t)};try{e.call(void 0,function(t){o.call(r,t)},function(t){i.call(r,t)})}catch(s){i.call(r,s)}}var f,p,h,l=Object.prototype.toString,d="undefined"!=typeof setImmediate?function(t){return setImmediate(t)}:setTimeout;try{Object.defineProperty({},"x",{}),f=function(t,e,n,r){return Object.defineProperty(t,e,{value:n,writable:!0,configurable:r!==!1})}}catch(y){f=function(t,e,n){return t[e]=n,t}}h=function(){function t(t,e){this.fn=t,this.self=e,this.next=void 0}var e,n,r;return{add:function(o,i){r=new t(o,i),n?n.next=r:e=r,n=r,r=void 0},drain:function(){var t=e;for(e=n=p=void 0;t;)t.fn.call(t.self),t=t.next}}}();var v=f({},"constructor",c,!1);return c.prototype=v,f(v,"__NPO__",0,!1),f(c,"resolve",function(t){var e=this;return t&&"object"==typeof t&&1===t.__NPO__?t:new e(function(e,n){if("function"!=typeof e||"function"!=typeof n)throw TypeError("Not a function");e(t)})}),f(c,"reject",function(t){return new this(function(e,n){if("function"!=typeof e||"function"!=typeof n)throw TypeError("Not a function");n(t)})}),f(c,"all",function(t){var e=this;return"[object Array]"!=l.call(t)?e.reject(TypeError("Not an array")):0===t.length?e.resolve([]):new e(function(n,r){if("function"!=typeof n||"function"!=typeof r)throw TypeError("Not a function");var o=t.length,i=Array(o),u=0;s(e,t,function(t,e){i[t]=e,++u===o&&n(i)},r)})}),f(c,"race",function(t){var e=this;return"[object Array]"!=l.call(t)?e.reject(TypeError("Not an array")):new e(function(n,r){if("function"!=typeof n||"function"!=typeof r)throw TypeError("Not a function");s(e,t,function(t,e){n(e)},r)})}),c})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],4:[function(t,e,n){"use strict";function r(t){return o[t.split(":")[0]]||i}var o={file:t("./lib/loaders/file"),http:t("./lib/loaders/http"),https:t("./lib/loaders/http")},i="object"==typeof window||"function"==typeof importScripts?o.http:o.file;"undefined"==typeof Promise&&t("native-promise-only"),e.exports.load=function(t,e,n){var o=Promise.resolve();return 2===arguments.length&&"function"==typeof e&&(n=e,e=void 0),o=o.then(function(){if("undefined"==typeof t)throw new TypeError("location is required");if("string"!=typeof t)throw new TypeError("location must be a string");if("undefined"!=typeof e){if("object"!=typeof e)throw new TypeError("options must be an object")}else e={};if("undefined"!=typeof n&&"function"!=typeof n)throw new TypeError("callback must be a function")}),o=o.then(function(){return new Promise(function(n,o){var i=r(t);i.load(t,e,function(t,e){t?o(t):n(e)})})}),"function"==typeof n&&(o=o.then(function(t){n(void 0,t)},function(t){n(t)})),o}},{"./lib/loaders/file":5,"./lib/loaders/http":6,"native-promise-only":3}],5:[function(t,e,n){"use strict";e.exports.load=function(t,e,n){n(new TypeError("The 'file' scheme is not supported in the browser"))}},{}],6:[function(t,e,n){"use strict";var r=t("superagent"),o=["delete","get","head","patch","post","put"];e.exports.load=function(t,e,n){var i,s,u=t.split("#")[0],a=e.method?e.method.toLowerCase():"get";"undefined"!=typeof e.prepareRequest&&"function"!=typeof e.prepareRequest?i=new TypeError("options.prepareRequest must be a function"):"undefined"!=typeof e.method&&("string"!=typeof e.method?i=new TypeError("options.method must be a string"):-1===o.indexOf(e.method)&&(i=new TypeError("options.method must be one of the following: "+o.slice(0,o.length-1).join(", ")+" or "+o[o.length-1]))),i?n(i):(s=r["delete"===a?"del":a](u),e.prepareRequest&&e.prepareRequest(s),"function"==typeof s.buffer&&s.buffer(!0),s.end(function(t,e){n(t,e?e.text:e)}))}},{superagent:7}],7:[function(t,e,n){function r(){}function o(t){var e={}.toString.call(t);switch(e){case"[object File]":case"[object Blob]":case"[object FormData]":return!0;default:return!1}}function i(t){return t===Object(t)}function s(t){if(!i(t))return t;var e=[];for(var n in t)null!=t[n]&&e.push(encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return e.join("&")}function u(t){for(var e,n,r={},o=t.split("&"),i=0,s=o.length;s>i;++i)n=o[i],e=n.split("="),r[decodeURIComponent(e[0])]=decodeURIComponent(e[1]);return r}function a(t){var e,n,r,o,i=t.split(/\r?\n/),s={};i.pop();for(var u=0,a=i.length;a>u;++u)n=i[u],e=n.indexOf(":"),r=n.slice(0,e).toLowerCase(),o=m(n.slice(e+1)),s[r]=o;return s}function c(t){return t.split(/ *; */).shift()}function f(t){return v(t.split(/ *; */),function(t,e){var n=e.split(/ *= */),r=n.shift(),o=n.shift();return r&&o&&(t[r]=o),t},{})}function p(t,e){e=e||{},this.req=t,this.xhr=this.req.xhr,this.text="HEAD"!=this.req.method&&(""===this.xhr.responseType||"text"===this.xhr.responseType)||"undefined"==typeof this.xhr.responseType?this.xhr.responseText:null,this.statusText=this.req.xhr.statusText,this.setStatusProperties(this.xhr.status),this.header=this.headers=a(this.xhr.getAllResponseHeaders()),this.header["content-type"]=this.xhr.getResponseHeader("content-type"),this.setHeaderProperties(this.header),this.body="HEAD"!=this.req.method?this.parseBody(this.text?this.text:this.xhr.response):null}function h(t,e){var n=this;y.call(this),this._query=this._query||[],this.method=t,this.url=e,this.header={},this._header={},this.on("end",function(){var t=null,e=null;try{e=new p(n)}catch(r){return t=new Error("Parser is unable to parse the response"),t.parse=!0,t.original=r,n.callback(t)}if(n.emit("response",e),t)return n.callback(t,e);if(e.status>=200&&e.status<300)return n.callback(t,e);var o=new Error(e.statusText||"Unsuccessful HTTP response");o.original=t,o.response=e,o.status=e.status,n.callback(o,e)})}function l(t,e){return"function"==typeof e?new h("GET",t).end(e):1==arguments.length?new h("GET",t):new h(t,e)}var d,y=t("emitter"),v=t("reduce");d="undefined"!=typeof window?window:"undefined"!=typeof self?self:this,l.getXHR=function(){if(!(!d.XMLHttpRequest||d.location&&"file:"==d.location.protocol&&d.ActiveXObject))return new XMLHttpRequest;try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(t){}return!1};var m="".trim?function(t){return t.trim()}:function(t){return t.replace(/(^\s*|\s*$)/g,"")};l.serializeObject=s,l.parseString=u,l.types={html:"text/html",json:"application/json",xml:"application/xml",urlencoded:"application/x-www-form-urlencoded",form:"application/x-www-form-urlencoded","form-data":"application/x-www-form-urlencoded"},l.serialize={"application/x-www-form-urlencoded":s,"application/json":JSON.stringify},l.parse={"application/x-www-form-urlencoded":u,"application/json":JSON.parse},p.prototype.get=function(t){return this.header[t.toLowerCase()]},p.prototype.setHeaderProperties=function(t){var e=this.header["content-type"]||"";this.type=c(e);var n=f(e);for(var r in n)this[r]=n[r]},p.prototype.parse=function(t){return this.parser=t,this},p.prototype.parseBody=function(t){var e=this.parser||l.parse[this.type];return e&&t&&(t.length||t instanceof Object)?e(t):null},p.prototype.setStatusProperties=function(t){1223===t&&(t=204);var e=t/100|0;this.status=this.statusCode=t,this.statusType=e,this.info=1==e,this.ok=2==e,this.clientError=4==e,this.serverError=5==e,this.error=4==e||5==e?this.toError():!1,this.accepted=202==t,this.noContent=204==t,this.badRequest=400==t,this.unauthorized=401==t,this.notAcceptable=406==t,this.notFound=404==t,this.forbidden=403==t},p.prototype.toError=function(){var t=this.req,e=t.method,n=t.url,r="cannot "+e+" "+n+" ("+this.status+")",o=new Error(r);return o.status=this.status,o.method=e,o.url=n,o},l.Response=p,y(h.prototype),h.prototype.use=function(t){return t(this),this},h.prototype.timeout=function(t){return this._timeout=t,this},h.prototype.clearTimeout=function(){return this._timeout=0,clearTimeout(this._timer),this},h.prototype.abort=function(){return this.aborted?void 0:(this.aborted=!0,this.xhr.abort(),this.clearTimeout(),this.emit("abort"),this)},h.prototype.set=function(t,e){if(i(t)){for(var n in t)this.set(n,t[n]);return this}return this._header[t.toLowerCase()]=e,this.header[t]=e,this},h.prototype.unset=function(t){return delete this._header[t.toLowerCase()],delete this.header[t],this},h.prototype.getHeader=function(t){return this._header[t.toLowerCase()]},h.prototype.type=function(t){return this.set("Content-Type",l.types[t]||t),this},h.prototype.accept=function(t){return this.set("Accept",l.types[t]||t),this},h.prototype.auth=function(t,e){var n=btoa(t+":"+e);return this.set("Authorization","Basic "+n),this},h.prototype.query=function(t){return"string"!=typeof t&&(t=s(t)),t&&this._query.push(t),this},h.prototype.field=function(t,e){return this._formData||(this._formData=new d.FormData),this._formData.append(t,e),this},h.prototype.attach=function(t,e,n){return this._formData||(this._formData=new d.FormData),this._formData.append(t,e,n),this},h.prototype.send=function(t){var e=i(t),n=this.getHeader("Content-Type");if(e&&i(this._data))for(var r in t)this._data[r]=t[r];else"string"==typeof t?(n||this.type("form"),n=this.getHeader("Content-Type"),this._data="application/x-www-form-urlencoded"==n?this._data?this._data+"&"+t:t:(this._data||"")+t):this._data=t;return!e||o(t)?this:(n||this.type("json"),this)},h.prototype.callback=function(t,e){var n=this._callback;this.clearTimeout(),n(t,e)},h.prototype.crossDomainError=function(){var t=new Error("Origin is not allowed by Access-Control-Allow-Origin");t.crossDomain=!0,this.callback(t)},h.prototype.timeoutError=function(){var t=this._timeout,e=new Error("timeout of "+t+"ms exceeded");e.timeout=t,this.callback(e)},h.prototype.withCredentials=function(){return this._withCredentials=!0,this},h.prototype.end=function(t){var e=this,n=this.xhr=l.getXHR(),i=this._query.join("&"),s=this._timeout,u=this._formData||this._data;this._callback=t||r,n.onreadystatechange=function(){if(4==n.readyState){var t;try{t=n.status}catch(r){t=0}if(0==t){if(e.timedout)return e.timeoutError();if(e.aborted)return;return e.crossDomainError()}e.emit("end")}};var a=function(t){t.total>0&&(t.percent=t.loaded/t.total*100),e.emit("progress",t)};this.hasListeners("progress")&&(n.onprogress=a);try{n.upload&&this.hasListeners("progress")&&(n.upload.onprogress=a)}catch(c){}if(s&&!this._timer&&(this._timer=setTimeout(function(){e.timedout=!0,e.abort()},s)),i&&(i=l.serializeObject(i),this.url+=~this.url.indexOf("?")?"&"+i:"?"+i),n.open(this.method,this.url,!0),this._withCredentials&&(n.withCredentials=!0),"GET"!=this.method&&"HEAD"!=this.method&&"string"!=typeof u&&!o(u)){var f=this.getHeader("Content-Type"),p=l.serialize[f?f.split(";")[0]:""];p&&(u=p(u))}for(var h in this.header)null!=this.header[h]&&n.setRequestHeader(h,this.header[h]);return this.emit("request",this),n.send(u),this},h.prototype.then=function(t,e){return this.end(function(n,r){n?e(n):t(r)})},l.Request=h,l.get=function(t,e,n){var r=l("GET",t);return"function"==typeof e&&(n=e,e=null),e&&r.query(e),n&&r.end(n),r},l.head=function(t,e,n){var r=l("HEAD",t);return"function"==typeof e&&(n=e,e=null),e&&r.send(e),n&&r.end(n),r},l.del=function(t,e){var n=l("DELETE",t);return e&&n.end(e),n},l.patch=function(t,e,n){var r=l("PATCH",t);return"function"==typeof e&&(n=e,e=null),e&&r.send(e),n&&r.end(n),r},l.post=function(t,e,n){var r=l("POST",t);return"function"==typeof e&&(n=e,e=null),e&&r.send(e),n&&r.end(n),r},l.put=function(t,e,n){var r=l("PUT",t);return"function"==typeof e&&(n=e,e=null),e&&r.send(e),n&&r.end(n),r},e.exports=l},{emitter:8,reduce:9}],8:[function(t,e,n){function r(t){return t?o(t):void 0}function o(t){for(var e in r.prototype)t[e]=r.prototype[e];return t}e.exports=r,r.prototype.on=r.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},r.prototype.once=function(t,e){function n(){r.off(t,n),e.apply(this,arguments)}var r=this;return this._callbacks=this._callbacks||{},n.fn=e,this.on(t,n),this},r.prototype.off=r.prototype.removeListener=r.prototype.removeAllListeners=r.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var n=this._callbacks[t];if(!n)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var r,o=0;o<n.length;o++)if(r=n[o],r===e||r.fn===e){n.splice(o,1);break}return this},r.prototype.emit=function(t){this._callbacks=this._callbacks||{};var e=[].slice.call(arguments,1),n=this._callbacks[t];if(n){n=n.slice(0);for(var r=0,o=n.length;o>r;++r)n[r].apply(this,e)}return this},r.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},r.prototype.hasListeners=function(t){return!!this.listeners(t).length}},{}],9:[function(t,e,n){e.exports=function(t,e,n){for(var r=0,o=t.length,i=3==arguments.length?n:t[r++];o>r;)i=e.call(null,i,t[r],++r,t);return i}},{}],10:[function(t,e,n){function r(t){this.value=t}function o(t,e,n){var r=[],o=[],s=!0;return function u(t){function a(){if("object"==typeof h.node&&null!==h.node){h.keys&&h.node_===h.node||(h.keys=d(h.node)),h.isLeaf=0==h.keys.length;for(var e=0;e<o.length;e++)if(o[e].node_===t){h.circular=o[e];break}}else h.isLeaf=!0,h.keys=null;h.notLeaf=!h.isLeaf,h.notRoot=!h.isRoot}var c=n?i(t):t,f={},p=!0,h={node:c,node_:t,path:[].concat(r),parent:o[o.length-1],parents:o,key:r.slice(-1)[0],isRoot:0===r.length,level:r.length,circular:null,update:function(t,e){h.isRoot||(h.parent.node[h.key]=t),h.node=t,e&&(p=!1)},"delete":function(t){delete h.parent.node[h.key],t&&(p=!1)},remove:function(t){y(h.parent.node)?h.parent.node.splice(h.key,1):delete h.parent.node[h.key],t&&(p=!1)},keys:null,before:function(t){f.before=t},after:function(t){f.after=t},pre:function(t){f.pre=t},post:function(t){f.post=t},stop:function(){s=!1},block:function(){p=!1}};if(!s)return h;a();var l=e.call(h,h.node);return void 0!==l&&h.update&&h.update(l),f.before&&f.before.call(h,h.node),p?("object"!=typeof h.node||null===h.node||h.circular||(o.push(h),a(),v(h.keys,function(t,e){r.push(t),f.pre&&f.pre.call(h,h.node[t],t);var o=u(h.node[t]);n&&m.call(h.node,t)&&(h.node[t]=o.node),o.isLast=e==h.keys.length-1,o.isFirst=0==e,f.post&&f.post.call(h,o),r.pop()}),o.pop()),f.after&&f.after.call(h,h.node),h):h}(t).node}function i(t){if("object"==typeof t&&null!==t){var e;if(y(t))e=[];else if(u(t))e=new Date(t.getTime?t.getTime():t);else if(a(t))e=new RegExp(t);else if(c(t))e={message:t.message};else if(f(t))e=new Boolean(t);else if(p(t))e=new Number(t);else if(h(t))e=new String(t);else if(Object.create&&Object.getPrototypeOf)e=Object.create(Object.getPrototypeOf(t));else if(t.constructor===Object)e={};else{var n=t.constructor&&t.constructor.prototype||t.__proto__||{},r=function(){};r.prototype=n,e=new r}return v(d(t),function(n){e[n]=t[n]}),e}return t}function s(t){return Object.prototype.toString.call(t)}function u(t){return"[object Date]"===s(t)}function a(t){return"[object RegExp]"===s(t)}function c(t){return"[object Error]"===s(t)}function f(t){return"[object Boolean]"===s(t)}function p(t){return"[object Number]"===s(t)}function h(t){return"[object String]"===s(t)}var l=e.exports=function(t){return new r(t)};r.prototype.get=function(t){for(var e=this.value,n=0;n<t.length;n++){var r=t[n];if(!e||!m.call(e,r)){e=void 0;break}e=e[r]}return e},r.prototype.has=function(t){for(var e=this.value,n=0;n<t.length;n++){var r=t[n];if(!e||!m.call(e,r))return!1;e=e[r]}return!0},r.prototype.set=function(t,e){for(var n=this.value,r=0;r<t.length-1;r++){var o=t[r];m.call(n,o)||(n[o]={}),n=n[o]}return n[t[r]]=e,e},r.prototype.map=function(t){return o(this.value,t,!0)},r.prototype.forEach=function(t){return this.value=o(this.value,t,!1),this.value},r.prototype.reduce=function(t,e){var n=1===arguments.length,r=n?this.value:e;return this.forEach(function(e){this.isRoot&&n||(r=t.call(this,r,e))}),r},r.prototype.paths=function(){var t=[];return this.forEach(function(e){t.push(this.path)}),t},r.prototype.nodes=function(){var t=[];return this.forEach(function(e){t.push(this.node)}),t},r.prototype.clone=function(){var t=[],e=[];return function n(r){for(var o=0;o<t.length;o++)if(t[o]===r)return e[o];if("object"==typeof r&&null!==r){var s=i(r);return t.push(r),e.push(s),v(d(r),function(t){s[t]=n(r[t])}),t.pop(),e.pop(),s}return r}(this.value)};var d=Object.keys||function(t){var e=[];for(var n in t)e.push(n);return e},y=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},v=function(t,e){if(t.forEach)return t.forEach(e);for(var n=0;n<t.length;n++)e(t[n],n,t)};v(d(r.prototype),function(t){l[t]=function(e){var n=[].slice.call(arguments,1),o=new r(e);return o[t].apply(o,n)}});var m=Object.hasOwnProperty||function(t,e){return e in t}},{}]},{},[1])(1)});
</script>

  <script>
/* Web Font Loader v1.6.24 - (c) Adobe Systems, Google. License: Apache 2.0 */
(function(){function aa(a,b,d){return a.call.apply(a.bind,arguments)}function ba(a,b,d){if(!a)throw Error();if(2<arguments.length){var c=Array.prototype.slice.call(arguments,2);return function(){var d=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(d,c);return a.apply(b,d)}}return function(){return a.apply(b,arguments)}}function p(a,b,d){p=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?aa:ba;return p.apply(null,arguments)}var q=Date.now||function(){return+new Date};function ca(a,b){this.a=a;this.m=b||a;this.c=this.m.document}var da=!!window.FontFace;function t(a,b,d,c){b=a.c.createElement(b);if(d)for(var e in d)d.hasOwnProperty(e)&&("style"==e?b.style.cssText=d[e]:b.setAttribute(e,d[e]));c&&b.appendChild(a.c.createTextNode(c));return b}function u(a,b,d){a=a.c.getElementsByTagName(b)[0];a||(a=document.documentElement);a.insertBefore(d,a.lastChild)}function v(a){a.parentNode&&a.parentNode.removeChild(a)}
function w(a,b,d){b=b||[];d=d||[];for(var c=a.className.split(/\s+/),e=0;e<b.length;e+=1){for(var f=!1,g=0;g<c.length;g+=1)if(b[e]===c[g]){f=!0;break}f||c.push(b[e])}b=[];for(e=0;e<c.length;e+=1){f=!1;for(g=0;g<d.length;g+=1)if(c[e]===d[g]){f=!0;break}f||b.push(c[e])}a.className=b.join(" ").replace(/\s+/g," ").replace(/^\s+|\s+$/,"")}function y(a,b){for(var d=a.className.split(/\s+/),c=0,e=d.length;c<e;c++)if(d[c]==b)return!0;return!1}
function z(a){if("string"===typeof a.f)return a.f;var b=a.m.location.protocol;"about:"==b&&(b=a.a.location.protocol);return"https:"==b?"https:":"http:"}function ea(a){return a.m.location.hostname||a.a.location.hostname}
function A(a,b,d){function c(){k&&e&&f&&(k(g),k=null)}b=t(a,"link",{rel:"stylesheet",href:b,media:"all"});var e=!1,f=!0,g=null,k=d||null;da?(b.onload=function(){e=!0;c()},b.onerror=function(){e=!0;g=Error("Stylesheet failed to load");c()}):setTimeout(function(){e=!0;c()},0);u(a,"head",b)}
function B(a,b,d,c){var e=a.c.getElementsByTagName("head")[0];if(e){var f=t(a,"script",{src:b}),g=!1;f.onload=f.onreadystatechange=function(){g||this.readyState&&"loaded"!=this.readyState&&"complete"!=this.readyState||(g=!0,d&&d(null),f.onload=f.onreadystatechange=null,"HEAD"==f.parentNode.tagName&&e.removeChild(f))};e.appendChild(f);setTimeout(function(){g||(g=!0,d&&d(Error("Script load timeout")))},c||5E3);return f}return null};function C(){this.a=0;this.c=null}function D(a){a.a++;return function(){a.a--;E(a)}}function F(a,b){a.c=b;E(a)}function E(a){0==a.a&&a.c&&(a.c(),a.c=null)};function G(a){this.a=a||"-"}G.prototype.c=function(a){for(var b=[],d=0;d<arguments.length;d++)b.push(arguments[d].replace(/[\W_]+/g,"").toLowerCase());return b.join(this.a)};function H(a,b){this.c=a;this.f=4;this.a="n";var d=(b||"n4").match(/^([nio])([1-9])$/i);d&&(this.a=d[1],this.f=parseInt(d[2],10))}function fa(a){return I(a)+" "+(a.f+"00")+" 300px "+J(a.c)}function J(a){var b=[];a=a.split(/,\s*/);for(var d=0;d<a.length;d++){var c=a[d].replace(/['"]/g,"");-1!=c.indexOf(" ")||/^\d/.test(c)?b.push("'"+c+"'"):b.push(c)}return b.join(",")}function K(a){return a.a+a.f}function I(a){var b="normal";"o"===a.a?b="oblique":"i"===a.a&&(b="italic");return b}
function ga(a){var b=4,d="n",c=null;a&&((c=a.match(/(normal|oblique|italic)/i))&&c[1]&&(d=c[1].substr(0,1).toLowerCase()),(c=a.match(/([1-9]00|normal|bold)/i))&&c[1]&&(/bold/i.test(c[1])?b=7:/[1-9]00/.test(c[1])&&(b=parseInt(c[1].substr(0,1),10))));return d+b};function ha(a,b){this.c=a;this.f=a.m.document.documentElement;this.h=b;this.a=new G("-");this.j=!1!==b.events;this.g=!1!==b.classes}function ia(a){a.g&&w(a.f,[a.a.c("wf","loading")]);L(a,"loading")}function M(a){if(a.g){var b=y(a.f,a.a.c("wf","active")),d=[],c=[a.a.c("wf","loading")];b||d.push(a.a.c("wf","inactive"));w(a.f,d,c)}L(a,"inactive")}function L(a,b,d){if(a.j&&a.h[b])if(d)a.h[b](d.c,K(d));else a.h[b]()};function ja(){this.c={}}function ka(a,b,d){var c=[],e;for(e in b)if(b.hasOwnProperty(e)){var f=a.c[e];f&&c.push(f(b[e],d))}return c};function N(a,b){this.c=a;this.f=b;this.a=t(this.c,"span",{"aria-hidden":"true"},this.f)}function O(a){u(a.c,"body",a.a)}function P(a){return"display:block;position:absolute;top:-9999px;left:-9999px;font-size:300px;width:auto;height:auto;line-height:normal;margin:0;padding:0;font-variant:normal;white-space:nowrap;font-family:"+J(a.c)+";"+("font-style:"+I(a)+";font-weight:"+(a.f+"00")+";")};function Q(a,b,d,c,e,f){this.g=a;this.j=b;this.a=c;this.c=d;this.f=e||3E3;this.h=f||void 0}Q.prototype.start=function(){var a=this.c.m.document,b=this,d=q(),c=new Promise(function(c,e){function k(){q()-d>=b.f?e():a.fonts.load(fa(b.a),b.h).then(function(a){1<=a.length?c():setTimeout(k,25)},function(){e()})}k()}),e=new Promise(function(a,c){setTimeout(c,b.f)});Promise.race([e,c]).then(function(){b.g(b.a)},function(){b.j(b.a)})};function R(a,b,d,c,e,f,g){this.v=a;this.B=b;this.c=d;this.a=c;this.s=g||"BESbswy";this.f={};this.w=e||3E3;this.u=f||null;this.o=this.j=this.h=this.g=null;this.g=new N(this.c,this.s);this.h=new N(this.c,this.s);this.j=new N(this.c,this.s);this.o=new N(this.c,this.s);a=new H(this.a.c+",serif",K(this.a));a=P(a);this.g.a.style.cssText=a;a=new H(this.a.c+",sans-serif",K(this.a));a=P(a);this.h.a.style.cssText=a;a=new H("serif",K(this.a));a=P(a);this.j.a.style.cssText=a;a=new H("sans-serif",K(this.a));a=
P(a);this.o.a.style.cssText=a;O(this.g);O(this.h);O(this.j);O(this.o)}var S={D:"serif",C:"sans-serif"},T=null;function U(){if(null===T){var a=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent);T=!!a&&(536>parseInt(a[1],10)||536===parseInt(a[1],10)&&11>=parseInt(a[2],10))}return T}R.prototype.start=function(){this.f.serif=this.j.a.offsetWidth;this.f["sans-serif"]=this.o.a.offsetWidth;this.A=q();la(this)};
function ma(a,b,d){for(var c in S)if(S.hasOwnProperty(c)&&b===a.f[S[c]]&&d===a.f[S[c]])return!0;return!1}function la(a){var b=a.g.a.offsetWidth,d=a.h.a.offsetWidth,c;(c=b===a.f.serif&&d===a.f["sans-serif"])||(c=U()&&ma(a,b,d));c?q()-a.A>=a.w?U()&&ma(a,b,d)&&(null===a.u||a.u.hasOwnProperty(a.a.c))?V(a,a.v):V(a,a.B):na(a):V(a,a.v)}function na(a){setTimeout(p(function(){la(this)},a),50)}function V(a,b){setTimeout(p(function(){v(this.g.a);v(this.h.a);v(this.j.a);v(this.o.a);b(this.a)},a),0)};function W(a,b,d){this.c=a;this.a=b;this.f=0;this.o=this.j=!1;this.s=d}var X=null;W.prototype.g=function(a){var b=this.a;b.g&&w(b.f,[b.a.c("wf",a.c,K(a).toString(),"active")],[b.a.c("wf",a.c,K(a).toString(),"loading"),b.a.c("wf",a.c,K(a).toString(),"inactive")]);L(b,"fontactive",a);this.o=!0;oa(this)};
W.prototype.h=function(a){var b=this.a;if(b.g){var d=y(b.f,b.a.c("wf",a.c,K(a).toString(),"active")),c=[],e=[b.a.c("wf",a.c,K(a).toString(),"loading")];d||c.push(b.a.c("wf",a.c,K(a).toString(),"inactive"));w(b.f,c,e)}L(b,"fontinactive",a);oa(this)};function oa(a){0==--a.f&&a.j&&(a.o?(a=a.a,a.g&&w(a.f,[a.a.c("wf","active")],[a.a.c("wf","loading"),a.a.c("wf","inactive")]),L(a,"active")):M(a.a))};function pa(a){this.j=a;this.a=new ja;this.h=0;this.f=this.g=!0}pa.prototype.load=function(a){this.c=new ca(this.j,a.context||this.j);this.g=!1!==a.events;this.f=!1!==a.classes;qa(this,new ha(this.c,a),a)};
function ra(a,b,d,c,e){var f=0==--a.h;(a.f||a.g)&&setTimeout(function(){var a=e||null,k=c||null||{};if(0===d.length&&f)M(b.a);else{b.f+=d.length;f&&(b.j=f);var h,m=[];for(h=0;h<d.length;h++){var l=d[h],n=k[l.c],r=b.a,x=l;r.g&&w(r.f,[r.a.c("wf",x.c,K(x).toString(),"loading")]);L(r,"fontloading",x);r=null;null===X&&(X=window.FontFace?(x=/Gecko.*Firefox\/(\d+)/.exec(window.navigator.userAgent))?42<parseInt(x[1],10):!0:!1);X?r=new Q(p(b.g,b),p(b.h,b),b.c,l,b.s,n):r=new R(p(b.g,b),p(b.h,b),b.c,l,b.s,a,
n);m.push(r)}for(h=0;h<m.length;h++)m[h].start()}},0)}function qa(a,b,d){var c=[],e=d.timeout;ia(b);var c=ka(a.a,d,a.c),f=new W(a.c,b,e);a.h=c.length;b=0;for(d=c.length;b<d;b++)c[b].load(function(b,c,d){ra(a,f,b,c,d)})};function sa(a,b){this.c=a;this.a=b}function ta(a,b,d){var c=z(a.c);a=(a.a.api||"fast.fonts.net/jsapi").replace(/^.*http(s?):(\/\/)?/,"");return c+"//"+a+"/"+b+".js"+(d?"?v="+d:"")}
sa.prototype.load=function(a){function b(){if(e["__mti_fntLst"+d]){var c=e["__mti_fntLst"+d](),g=[],k;if(c)for(var h=0;h<c.length;h++){var m=c[h].fontfamily;void 0!=c[h].fontStyle&&void 0!=c[h].fontWeight?(k=c[h].fontStyle+c[h].fontWeight,g.push(new H(m,k))):g.push(new H(m))}a(g)}else setTimeout(function(){b()},50)}var d=this.a.projectId,c=this.a.version;if(d){var e=this.c.m;B(this.c,ta(this,d,c),function(c){c?a([]):b()}).id="__MonotypeAPIScript__"+d}else a([])};function ua(a,b){this.c=a;this.a=b}ua.prototype.load=function(a){var b,d,c=this.a.urls||[],e=this.a.families||[],f=this.a.testStrings||{},g=new C;b=0;for(d=c.length;b<d;b++)A(this.c,c[b],D(g));var k=[];b=0;for(d=e.length;b<d;b++)if(c=e[b].split(":"),c[1])for(var h=c[1].split(","),m=0;m<h.length;m+=1)k.push(new H(c[0],h[m]));else k.push(new H(c[0]));F(g,function(){a(k,f)})};function va(a,b,d){a?this.c=a:this.c=b+wa;this.a=[];this.f=[];this.g=d||""}var wa="//fonts.googleapis.com/css";function xa(a,b){for(var d=b.length,c=0;c<d;c++){var e=b[c].split(":");3==e.length&&a.f.push(e.pop());var f="";2==e.length&&""!=e[1]&&(f=":");a.a.push(e.join(f))}}
function ya(a){if(0==a.a.length)throw Error("No fonts to load!");if(-1!=a.c.indexOf("kit="))return a.c;for(var b=a.a.length,d=[],c=0;c<b;c++)d.push(a.a[c].replace(/ /g,"+"));b=a.c+"?family="+d.join("%7C");0<a.f.length&&(b+="&subset="+a.f.join(","));0<a.g.length&&(b+="&text="+encodeURIComponent(a.g));return b};function za(a){this.f=a;this.a=[];this.c={}}
var Aa={latin:"BESbswy",cyrillic:"\u0439\u044f\u0416",greek:"\u03b1\u03b2\u03a3",khmer:"\u1780\u1781\u1782",Hanuman:"\u1780\u1781\u1782"},Ba={thin:"1",extralight:"2","extra-light":"2",ultralight:"2","ultra-light":"2",light:"3",regular:"4",book:"4",medium:"5","semi-bold":"6",semibold:"6","demi-bold":"6",demibold:"6",bold:"7","extra-bold":"8",extrabold:"8","ultra-bold":"8",ultrabold:"8",black:"9",heavy:"9",l:"3",r:"4",b:"7"},Ca={i:"i",italic:"i",n:"n",normal:"n"},Da=/^(thin|(?:(?:extra|ultra)-?)?light|regular|book|medium|(?:(?:semi|demi|extra|ultra)-?)?bold|black|heavy|l|r|b|[1-9]00)?(n|i|normal|italic)?$/;
function Ea(a){for(var b=a.f.length,d=0;d<b;d++){var c=a.f[d].split(":"),e=c[0].replace(/\+/g," "),f=["n4"];if(2<=c.length){var g;var k=c[1];g=[];if(k)for(var k=k.split(","),h=k.length,m=0;m<h;m++){var l;l=k[m];if(l.match(/^[\w-]+$/)){var n=Da.exec(l.toLowerCase());if(null==n)l="";else{l=n[2];l=null==l||""==l?"n":Ca[l];n=n[1];if(null==n||""==n)n="4";else var r=Ba[n],n=r?r:isNaN(n)?"4":n.substr(0,1);l=[l,n].join("")}}else l="";l&&g.push(l)}0<g.length&&(f=g);3==c.length&&(c=c[2],g=[],c=c?c.split(","):
g,0<c.length&&(c=Aa[c[0]])&&(a.c[e]=c))}a.c[e]||(c=Aa[e])&&(a.c[e]=c);for(c=0;c<f.length;c+=1)a.a.push(new H(e,f[c]))}};function Fa(a,b){this.c=a;this.a=b}var Ga={Arimo:!0,Cousine:!0,Tinos:!0};Fa.prototype.load=function(a){var b=new C,d=this.c,c=new va(this.a.api,z(d),this.a.text),e=this.a.families;xa(c,e);var f=new za(e);Ea(f);A(d,ya(c),D(b));F(b,function(){a(f.a,f.c,Ga)})};function Ha(a,b){this.c=a;this.a=b}Ha.prototype.load=function(a){var b=this.a.id,d=this.c.m;b?B(this.c,(this.a.api||"https://use.typekit.net")+"/"+b+".js",function(b){if(b)a([]);else if(d.Typekit&&d.Typekit.config&&d.Typekit.config.fn){b=d.Typekit.config.fn;for(var e=[],f=0;f<b.length;f+=2)for(var g=b[f],k=b[f+1],h=0;h<k.length;h++)e.push(new H(g,k[h]));try{d.Typekit.load({events:!1,classes:!1,async:!0})}catch(m){}a(e)}},2E3):a([])};function Ia(a,b){this.c=a;this.f=b;this.a=[]}Ia.prototype.load=function(a){var b=this.f.id,d=this.c.m,c=this;b?(d.__webfontfontdeckmodule__||(d.__webfontfontdeckmodule__={}),d.__webfontfontdeckmodule__[b]=function(b,d){for(var g=0,k=d.fonts.length;g<k;++g){var h=d.fonts[g];c.a.push(new H(h.name,ga("font-weight:"+h.weight+";font-style:"+h.style)))}a(c.a)},B(this.c,z(this.c)+(this.f.api||"//f.fontdeck.com/s/css/js/")+ea(this.c)+"/"+b+".js",function(b){b&&a([])})):a([])};var Y=new pa(window);Y.a.c.custom=function(a,b){return new ua(b,a)};Y.a.c.fontdeck=function(a,b){return new Ia(b,a)};Y.a.c.monotype=function(a,b){return new sa(b,a)};Y.a.c.typekit=function(a,b){return new Ha(b,a)};Y.a.c.google=function(a,b){return new Fa(b,a)};var Z={load:p(Y.load,Y)};"function"===typeof define&&define.amd?define(function(){return Z}):"undefined"!==typeof module&&module.exports?module.exports=Z:(window.WebFont=Z,window.WebFontConfig&&Y.load(window.WebFontConfig));}());
</script>

  <script>
  $(document).ready(function () {
    $('.nav-tabs-examples').find('a:first').tab('show');
    $(this).scrollspy({ target: '#scrollingNav', offset: 18 });
  });
  </script>
</body>
</html>
