docurium 0.4.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.github/workflows/main.yml +42 -0
- data/Gemfile +4 -4
- data/README.md +0 -15
- data/bin/cm +19 -2
- data/docurium.gemspec +7 -6
- data/lib/docurium/cli.rb +6 -1
- data/lib/docurium/debug.rb +41 -0
- data/lib/docurium/docparser.rb +96 -27
- data/lib/docurium/layout.rb +0 -3
- data/lib/docurium/version.rb +1 -1
- data/lib/docurium.rb +276 -92
- data/lib/libdetect.rb +1 -1
- data/site/css/style.css +17 -11
- data/site/index.html +133 -122
- data/site/js/backbone.js +1 -1
- data/site/js/docurium.js +178 -162
- data/site/js/underscore.js +5 -5
- data/test/docurium_test.rb +235 -0
- data/test/fixtures/git2/cherrypick.h +19 -0
- data/test/fixtures/git2/common.h +1 -0
- data/test/fixtures/git2/repository.h +39 -0
- data/test/fixtures/git2/types.h +2 -0
- data/test/gen_test.rb +2 -2
- data/test/parser_test.rb +18 -14
- metadata +38 -23
- data/.travis.yml +0 -13
- data/test/repo_test.rb +0 -136
data/site/js/underscore.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
|
2
|
-
//
|
3
|
-
//
|
1
|
+
!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n="undefined"!=typeof globalThis?globalThis:n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){
|
2
|
+
// Underscore.js 1.13.1
|
3
|
+
// https://underscorejs.org
|
4
|
+
// (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
|
4
5
|
// Underscore may be freely distributed under the MIT license.
|
5
|
-
(function(){var n=this,t=n._,r=Array.prototype,e=Object.prototype,u=Function.prototype,i=r.push,a=r.slice,o=r.concat,l=e.toString,c=e.hasOwnProperty,f=Array.isArray,s=Object.keys,p=u.bind,h=function(n){return n instanceof h?n:this instanceof h?void(this._wrapped=n):new h(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=h),exports._=h):n._=h,h.VERSION="1.7.0";var g=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}};h.iteratee=function(n,t,r){return null==n?h.identity:h.isFunction(n)?g(n,t,r):h.isObject(n)?h.matches(n):h.property(n)},h.each=h.forEach=function(n,t,r){if(null==n)return n;t=g(t,r);var e,u=n.length;if(u===+u)for(e=0;u>e;e++)t(n[e],e,n);else{var i=h.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},h.map=h.collect=function(n,t,r){if(null==n)return[];t=h.iteratee(t,r);for(var e,u=n.length!==+n.length&&h.keys(n),i=(u||n).length,a=Array(i),o=0;i>o;o++)e=u?u[o]:o,a[o]=t(n[e],e,n);return a};var v="Reduce of empty array with no initial value";h.reduce=h.foldl=h.inject=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length,o=0;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[o++]:o++]}for(;a>o;o++)u=i?i[o]:o,r=t(r,n[u],u,n);return r},h.reduceRight=h.foldr=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[--a]:--a]}for(;a--;)u=i?i[a]:a,r=t(r,n[u],u,n);return r},h.find=h.detect=function(n,t,r){var e;return t=h.iteratee(t,r),h.some(n,function(n,r,u){return t(n,r,u)?(e=n,!0):void 0}),e},h.filter=h.select=function(n,t,r){var e=[];return null==n?e:(t=h.iteratee(t,r),h.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e)},h.reject=function(n,t,r){return h.filter(n,h.negate(h.iteratee(t)),r)},h.every=h.all=function(n,t,r){if(null==n)return!0;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,!t(n[u],u,n))return!1;return!0},h.some=h.any=function(n,t,r){if(null==n)return!1;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,t(n[u],u,n))return!0;return!1},h.contains=h.include=function(n,t){return null==n?!1:(n.length!==+n.length&&(n=h.values(n)),h.indexOf(n,t)>=0)},h.invoke=function(n,t){var r=a.call(arguments,2),e=h.isFunction(t);return h.map(n,function(n){return(e?t:n[t]).apply(n,r)})},h.pluck=function(n,t){return h.map(n,h.property(t))},h.where=function(n,t){return h.filter(n,h.matches(t))},h.findWhere=function(n,t){return h.find(n,h.matches(t))},h.max=function(n,t,r){var e,u,i=-1/0,a=-1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],e>i&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(u>a||u===-1/0&&i===-1/0)&&(i=n,a=u)});return i},h.min=function(n,t,r){var e,u,i=1/0,a=1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],i>e&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(a>u||1/0===u&&1/0===i)&&(i=n,a=u)});return i},h.shuffle=function(n){for(var t,r=n&&n.length===+n.length?n:h.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=h.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},h.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=h.values(n)),n[h.random(n.length-1)]):h.shuffle(n).slice(0,Math.max(0,t))},h.sortBy=function(n,t,r){return t=h.iteratee(t,r),h.pluck(h.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var m=function(n){return function(t,r,e){var u={};return r=h.iteratee(r,e),h.each(t,function(e,i){var a=r(e,i,t);n(u,e,a)}),u}};h.groupBy=m(function(n,t,r){h.has(n,r)?n[r].push(t):n[r]=[t]}),h.indexBy=m(function(n,t,r){n[r]=t}),h.countBy=m(function(n,t,r){h.has(n,r)?n[r]++:n[r]=1}),h.sortedIndex=function(n,t,r,e){r=h.iteratee(r,e,1);for(var u=r(t),i=0,a=n.length;a>i;){var o=i+a>>>1;r(n[o])<u?i=o+1:a=o}return i},h.toArray=function(n){return n?h.isArray(n)?a.call(n):n.length===+n.length?h.map(n,h.identity):h.values(n):[]},h.size=function(n){return null==n?0:n.length===+n.length?n.length:h.keys(n).length},h.partition=function(n,t,r){t=h.iteratee(t,r);var e=[],u=[];return h.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},h.first=h.head=h.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:0>t?[]:a.call(n,0,t)},h.initial=function(n,t,r){return a.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},h.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:a.call(n,Math.max(n.length-t,0))},h.rest=h.tail=h.drop=function(n,t,r){return a.call(n,null==t||r?1:t)},h.compact=function(n){return h.filter(n,h.identity)};var y=function(n,t,r,e){if(t&&h.every(n,h.isArray))return o.apply(e,n);for(var u=0,a=n.length;a>u;u++){var l=n[u];h.isArray(l)||h.isArguments(l)?t?i.apply(e,l):y(l,t,r,e):r||e.push(l)}return e};h.flatten=function(n,t){return y(n,t,!1,[])},h.without=function(n){return h.difference(n,a.call(arguments,1))},h.uniq=h.unique=function(n,t,r,e){if(null==n)return[];h.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=h.iteratee(r,e));for(var u=[],i=[],a=0,o=n.length;o>a;a++){var l=n[a];if(t)a&&i===l||u.push(l),i=l;else if(r){var c=r(l,a,n);h.indexOf(i,c)<0&&(i.push(c),u.push(l))}else h.indexOf(u,l)<0&&u.push(l)}return u},h.union=function(){return h.uniq(y(arguments,!0,!0,[]))},h.intersection=function(n){if(null==n)return[];for(var t=[],r=arguments.length,e=0,u=n.length;u>e;e++){var i=n[e];if(!h.contains(t,i)){for(var a=1;r>a&&h.contains(arguments[a],i);a++);a===r&&t.push(i)}}return t},h.difference=function(n){var t=y(a.call(arguments,1),!0,!0,[]);return h.filter(n,function(n){return!h.contains(t,n)})},h.zip=function(n){if(null==n)return[];for(var t=h.max(arguments,"length").length,r=Array(t),e=0;t>e;e++)r[e]=h.pluck(arguments,e);return r},h.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},h.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=h.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}for(;u>e;e++)if(n[e]===t)return e;return-1},h.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=n.length;for("number"==typeof r&&(e=0>r?e+r+1:Math.min(e,r+1));--e>=0;)if(n[e]===t)return e;return-1},h.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=r||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=Array(e),i=0;e>i;i++,n+=r)u[i]=n;return u};var d=function(){};h.bind=function(n,t){var r,e;if(p&&n.bind===p)return p.apply(n,a.call(arguments,1));if(!h.isFunction(n))throw new TypeError("Bind must be called on a function");return r=a.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(a.call(arguments)));d.prototype=n.prototype;var u=new d;d.prototype=null;var i=n.apply(u,r.concat(a.call(arguments)));return h.isObject(i)?i:u}},h.partial=function(n){var t=a.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===h&&(e[u]=arguments[r++]);for(;r<arguments.length;)e.push(arguments[r++]);return n.apply(this,e)}},h.bindAll=function(n){var t,r,e=arguments.length;if(1>=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=h.bind(n[r],n);return n},h.memoize=function(n,t){var r=function(e){var u=r.cache,i=t?t.apply(this,arguments):e;return h.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},h.delay=function(n,t){var r=a.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},h.defer=function(n){return h.delay.apply(h,[n,1].concat(a.call(arguments,1)))},h.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var l=function(){o=r.leading===!1?0:h.now(),a=null,i=n.apply(e,u),a||(e=u=null)};return function(){var c=h.now();o||r.leading!==!1||(o=c);var f=t-(c-o);return e=this,u=arguments,0>=f||f>t?(clearTimeout(a),a=null,o=c,i=n.apply(e,u),a||(e=u=null)):a||r.trailing===!1||(a=setTimeout(l,f)),i}},h.debounce=function(n,t,r){var e,u,i,a,o,l=function(){var c=h.now()-a;t>c&&c>0?e=setTimeout(l,t-c):(e=null,r||(o=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,a=h.now();var c=r&&!e;return e||(e=setTimeout(l,t)),c&&(o=n.apply(i,u),i=u=null),o}},h.wrap=function(n,t){return h.partial(t,n)},h.negate=function(n){return function(){return!n.apply(this,arguments)}},h.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},h.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},h.before=function(n,t){var r;return function(){return--n>0?r=t.apply(this,arguments):t=null,r}},h.once=h.partial(h.before,2),h.keys=function(n){if(!h.isObject(n))return[];if(s)return s(n);var t=[];for(var r in n)h.has(n,r)&&t.push(r);return t},h.values=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},h.pairs=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},h.invert=function(n){for(var t={},r=h.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},h.functions=h.methods=function(n){var t=[];for(var r in n)h.isFunction(n[r])&&t.push(r);return t.sort()},h.extend=function(n){if(!h.isObject(n))return n;for(var t,r,e=1,u=arguments.length;u>e;e++){t=arguments[e];for(r in t)c.call(t,r)&&(n[r]=t[r])}return n},h.pick=function(n,t,r){var e,u={};if(null==n)return u;if(h.isFunction(t)){t=g(t,r);for(e in n){var i=n[e];t(i,e,n)&&(u[e]=i)}}else{var l=o.apply([],a.call(arguments,1));n=new Object(n);for(var c=0,f=l.length;f>c;c++)e=l[c],e in n&&(u[e]=n[e])}return u},h.omit=function(n,t,r){if(h.isFunction(t))t=h.negate(t);else{var e=h.map(o.apply([],a.call(arguments,1)),String);t=function(n,t){return!h.contains(e,t)}}return h.pick(n,t,r)},h.defaults=function(n){if(!h.isObject(n))return n;for(var t=1,r=arguments.length;r>t;t++){var e=arguments[t];for(var u in e)n[u]===void 0&&(n[u]=e[u])}return n},h.clone=function(n){return h.isObject(n)?h.isArray(n)?n.slice():h.extend({},n):n},h.tap=function(n,t){return t(n),n};var b=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof h&&(n=n._wrapped),t instanceof h&&(t=t._wrapped);var u=l.call(n);if(u!==l.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]===n)return e[i]===t;var a=n.constructor,o=t.constructor;if(a!==o&&"constructor"in n&&"constructor"in t&&!(h.isFunction(a)&&a instanceof a&&h.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c,f;if("[object Array]"===u){if(c=n.length,f=c===t.length)for(;c--&&(f=b(n[c],t[c],r,e)););}else{var s,p=h.keys(n);if(c=p.length,f=h.keys(t).length===c)for(;c--&&(s=p[c],f=h.has(t,s)&&b(n[s],t[s],r,e)););}return r.pop(),e.pop(),f};h.isEqual=function(n,t){return b(n,t,[],[])},h.isEmpty=function(n){if(null==n)return!0;if(h.isArray(n)||h.isString(n)||h.isArguments(n))return 0===n.length;for(var t in n)if(h.has(n,t))return!1;return!0},h.isElement=function(n){return!(!n||1!==n.nodeType)},h.isArray=f||function(n){return"[object Array]"===l.call(n)},h.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},h.each(["Arguments","Function","String","Number","Date","RegExp"],function(n){h["is"+n]=function(t){return l.call(t)==="[object "+n+"]"}}),h.isArguments(arguments)||(h.isArguments=function(n){return h.has(n,"callee")}),"function"!=typeof/./&&(h.isFunction=function(n){return"function"==typeof n||!1}),h.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},h.isNaN=function(n){return h.isNumber(n)&&n!==+n},h.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===l.call(n)},h.isNull=function(n){return null===n},h.isUndefined=function(n){return n===void 0},h.has=function(n,t){return null!=n&&c.call(n,t)},h.noConflict=function(){return n._=t,this},h.identity=function(n){return n},h.constant=function(n){return function(){return n}},h.noop=function(){},h.property=function(n){return function(t){return t[n]}},h.matches=function(n){var t=h.pairs(n),r=t.length;return function(n){if(null==n)return!r;n=new Object(n);for(var e=0;r>e;e++){var u=t[e],i=u[0];if(u[1]!==n[i]||!(i in n))return!1}return!0}},h.times=function(n,t,r){var e=Array(Math.max(0,n));t=g(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},h.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},h.now=Date.now||function(){return(new Date).getTime()};var _={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},w=h.invert(_),j=function(n){var t=function(t){return n[t]},r="(?:"+h.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};h.escape=j(_),h.unescape=j(w),h.result=function(n,t){if(null==n)return void 0;var r=n[t];return h.isFunction(r)?n[t]():r};var x=0;h.uniqueId=function(n){var t=++x+"";return n?n+t:t},h.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var A=/(.)^/,k={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},O=/\\|'|\r|\n|\u2028|\u2029/g,F=function(n){return"\\"+k[n]};h.template=function(n,t,r){!t&&r&&(t=r),t=h.defaults({},t,h.templateSettings);var e=RegExp([(t.escape||A).source,(t.interpolate||A).source,(t.evaluate||A).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(O,F),u=o+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":a&&(i+="';\n"+a+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var a=new Function(t.variable||"obj","_",i)}catch(o){throw o.source=i,o}var l=function(n){return a.call(this,n,h)},c=t.variable||"obj";return l.source="function("+c+"){\n"+i+"}",l},h.chain=function(n){var t=h(n);return t._chain=!0,t};var E=function(n){return this._chain?h(n).chain():n};h.mixin=function(n){h.each(h.functions(n),function(t){var r=h[t]=n[t];h.prototype[t]=function(){var n=[this._wrapped];return i.apply(n,arguments),E.call(this,r.apply(h,n))}})},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=r[n];h.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],E.call(this,r)}}),h.each(["concat","join","slice"],function(n){var t=r[n];h.prototype[n]=function(){return E.call(this,t.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}).call(this);
|
6
|
-
//# sourceMappingURL=underscore-min.map
|
6
|
+
var n="1.13.1",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,o=t.push,i=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l="undefined"!=typeof DataView,s=Array.isArray,p=Object.keys,v=Object.create,h=c&&ArrayBuffer.isView,y=isNaN,d=isFinite,g=!{toString:null}.propertyIsEnumerable("toString"),b=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u<t;u++)e[u]=arguments[u+r];switch(r){case 0:return n.call(this,e);case 1:return n.call(this,arguments[0],e);case 2:return n.call(this,arguments[0],arguments[1],e)}var o=Array(r+1);for(u=0;u<r;u++)o[u]=arguments[u];return o[r]=e,n.apply(this,o)}}function _(n){var r=typeof n;return"function"===r||"object"===r&&!!n}function w(n){return void 0===n}function A(n){return!0===n||!1===n||"[object Boolean]"===a.call(n)}function x(n){var r="[object "+n+"]";return function(n){return a.call(n)===r}}var S=x("String"),O=x("Number"),M=x("Date"),E=x("RegExp"),B=x("Error"),N=x("Symbol"),I=x("ArrayBuffer"),T=x("Function"),k=r.document&&r.document.childNodes;"function"!=typeof/./&&"object"!=typeof Int8Array&&"function"!=typeof k&&(T=function(n){return"function"==typeof n||!1});var D=T,R=x("Object"),F=l&&R(new DataView(new ArrayBuffer(8))),V="undefined"!=typeof Map&&R(new Map),P=x("DataView");var q=F?function(n){return null!=n&&D(n.getInt8)&&I(n.buffer)}:P,U=s||x("Array");function W(n,r){return null!=n&&f.call(n,r)}var z=x("Arguments");!function(){z(arguments)||(z=function(n){return W(n,"callee")})}();var L=z;function $(n){return O(n)&&y(n)}function C(n){return function(){return n}}function K(n){return function(r){var t=n(r);return"number"==typeof t&&t>=0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e<t;++e)r[n[e]]=!0;return{contains:function(n){return r[n]},push:function(t){return r[t]=!0,n.push(t)}}}(r);var t=b.length,u=n.constructor,o=D(u)&&u.prototype||e,i="constructor";for(W(n,i)&&!r.contains(i)&&r.push(i);t--;)(i=b[t])in n&&n[i]!==o[i]&&!r.contains(i)&&r.push(i)}function nn(n){if(!_(n))return[];if(p)return p(n);var r=[];for(var t in n)W(n,t)&&r.push(t);return g&&Z(n,r),r}function rn(n,r){var t=nn(r),e=t.length;if(null==n)return!e;for(var u=Object(n),o=0;o<e;o++){var i=t[o];if(r[i]!==u[i]||!(i in u))return!1}return!0}function tn(n){return n instanceof tn?n:this instanceof tn?void(this._wrapped=n):new tn(n)}function en(n){return new Uint8Array(n.buffer||n,n.byteOffset||0,G(n))}tn.VERSION=n,tn.prototype.value=function(){return this._wrapped},tn.prototype.valueOf=tn.prototype.toJSON=tn.prototype.value,tn.prototype.toString=function(){return String(this._wrapped)};var un="[object DataView]";function on(n,r,t,e){if(n===r)return 0!==n||1/n==1/r;if(null==n||null==r)return!1;if(n!=n)return r!=r;var o=typeof n;return("function"===o||"object"===o||"object"==typeof r)&&function n(r,t,e,o){r instanceof tn&&(r=r._wrapped);t instanceof tn&&(t=t._wrapped);var i=a.call(r);if(i!==a.call(t))return!1;if(F&&"[object Object]"==i&&q(r)){if(!q(t))return!1;i=un}switch(i){case"[object RegExp]":case"[object String]":return""+r==""+t;case"[object Number]":return+r!=+r?+t!=+t:0==+r?1/+r==1/t:+r==+t;case"[object Date]":case"[object Boolean]":return+r==+t;case"[object Symbol]":return u.valueOf.call(r)===u.valueOf.call(t);case"[object ArrayBuffer]":case un:return n(en(r),en(t),e,o)}var f="[object Array]"===i;if(!f&&X(r)){if(G(r)!==G(t))return!1;if(r.buffer===t.buffer&&r.byteOffset===t.byteOffset)return!0;f=!0}if(!f){if("object"!=typeof r||"object"!=typeof t)return!1;var c=r.constructor,l=t.constructor;if(c!==l&&!(D(c)&&c instanceof c&&D(l)&&l instanceof l)&&"constructor"in r&&"constructor"in t)return!1}o=o||[];var s=(e=e||[]).length;for(;s--;)if(e[s]===r)return o[s]===t;if(e.push(r),o.push(t),f){if((s=r.length)!==t.length)return!1;for(;s--;)if(!on(r[s],t[s],e,o))return!1}else{var p,v=nn(r);if(s=v.length,nn(t).length!==s)return!1;for(;s--;)if(p=v[s],!W(t,p)||!on(r[p],t[p],e,o))return!1}return e.pop(),o.pop(),!0}(n,r,t,e)}function an(n){if(!_(n))return[];var r=[];for(var t in n)r.push(t);return g&&Z(n,r),r}function fn(n){var r=Y(n);return function(t){if(null==t)return!1;var e=an(t);if(Y(e))return!1;for(var u=0;u<r;u++)if(!D(t[n[u]]))return!1;return n!==hn||!D(t[cn])}}var cn="forEach",ln="has",sn=["clear","delete"],pn=["get",ln,"set"],vn=sn.concat(cn,pn),hn=sn.concat(pn),yn=["add"].concat(sn,cn,ln),dn=V?fn(vn):x("Map"),gn=V?fn(hn):x("WeakMap"),bn=V?fn(yn):x("Set"),mn=x("WeakSet");function jn(n){for(var r=nn(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=n[r[u]];return e}function _n(n){for(var r={},t=nn(n),e=0,u=t.length;e<u;e++)r[n[t[e]]]=t[e];return r}function wn(n){var r=[];for(var t in n)D(n[t])&&r.push(t);return r.sort()}function An(n,r){return function(t){var e=arguments.length;if(r&&(t=Object(t)),e<2||null==t)return t;for(var u=1;u<e;u++)for(var o=arguments[u],i=n(o),a=i.length,f=0;f<a;f++){var c=i[f];r&&void 0!==t[c]||(t[c]=o[c])}return t}}var xn=An(an),Sn=An(nn),On=An(an,!0);function Mn(n){if(!_(n))return{};if(v)return v(n);var r=function(){};r.prototype=n;var t=new r;return r.prototype=null,t}function En(n){return _(n)?U(n)?n.slice():xn({},n):n}function Bn(n){return U(n)?n:[n]}function Nn(n){return tn.toPath(n)}function In(n,r){for(var t=r.length,e=0;e<t;e++){if(null==n)return;n=n[r[e]]}return t?n:void 0}function Tn(n,r,t){var e=In(n,Nn(r));return w(e)?t:e}function kn(n){return n}function Dn(n){return n=Sn({},n),function(r){return rn(r,n)}}function Rn(n){return n=Nn(n),function(r){return In(r,n)}}function Fn(n,r,t){if(void 0===r)return n;switch(null==t?3:t){case 1:return function(t){return n.call(r,t)};case 3:return function(t,e,u){return n.call(r,t,e,u)};case 4:return function(t,e,u,o){return n.call(r,t,e,u,o)}}return function(){return n.apply(r,arguments)}}function Vn(n,r,t){return null==n?kn:D(n)?Fn(n,r,t):_(n)&&!U(n)?Dn(n):Rn(n)}function Pn(n,r){return Vn(n,r,1/0)}function qn(n,r,t){return tn.iteratee!==Pn?tn.iteratee(n,r):Vn(n,r,t)}function Un(){}function Wn(n,r){return null==r&&(r=n,n=0),n+Math.floor(Math.random()*(r-n+1))}tn.toPath=Bn,tn.iteratee=Pn;var zn=Date.now||function(){return(new Date).getTime()};function Ln(n){var r=function(r){return n[r]},t="(?:"+nn(n).join("|")+")",e=RegExp(t),u=RegExp(t,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,r):n}}var $n={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},Cn=Ln($n),Kn=Ln(_n($n)),Jn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Qn=/\\|'|\r|\n|\u2028|\u2029/g;function Xn(n){return"\\"+Hn[n]}var Yn=/^\s*(\w|\$)+\s*$/;var Zn=0;function nr(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var rr=j((function(n,r){var t=rr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a<o;a++)i[a]=r[a]===t?arguments[u++]:r[a];for(;u<arguments.length;)i.push(arguments[u++]);return nr(n,e,this,this,i)};return e}));rr.placeholder=tn;var tr=j((function(n,r,t){if(!D(n))throw new TypeError("Bind must be called on a function");var e=j((function(u){return nr(n,e,r,this,t.concat(u))}));return e})),er=K(Y);function ur(n,r,t,e){if(e=e||[],r||0===r){if(r<=0)return e.concat(n)}else r=1/0;for(var u=e.length,o=0,i=Y(n);o<i;o++){var a=n[o];if(er(a)&&(U(a)||L(a)))if(r>1)ur(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f<c;)e[u++]=a[f++];else t||(e[u++]=a)}return e}var or=j((function(n,r){var t=(r=ur(r,!1,!1)).length;if(t<1)throw new Error("bindAll must be passed function names");for(;t--;){var e=r[t];n[e]=tr(n[e],n)}return n}));var ir=j((function(n,r,t){return setTimeout((function(){return n.apply(null,t)}),r)})),ar=rr(ir,tn,1);function fr(n){return function(){return!n.apply(this,arguments)}}function cr(n,r){var t;return function(){return--n>0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var lr=rr(cr,2);function sr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o<i;o++)if(r(n[e=u[o]],e,n))return e}function pr(n){return function(r,t,e){t=qn(t,e);for(var u=Y(r),o=n>0?0:u-1;o>=0&&o<u;o+=n)if(t(r[o],o,r))return o;return-1}}var vr=pr(1),hr=pr(-1);function yr(n,r,t,e){for(var u=(t=qn(t,e,1))(r),o=0,i=Y(n);o<i;){var a=Math.floor((o+i)/2);t(n[a])<u?o=a+1:i=a}return o}function dr(n,r,t){return function(e,u,o){var a=0,f=Y(e);if("number"==typeof o)n>0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o<f;o+=n)if(e[o]===u)return o;return-1}}var gr=dr(1,vr,yr),br=dr(-1,hr);function mr(n,r,t){var e=(er(n)?vr:sr)(n,r,t);if(void 0!==e&&-1!==e)return n[e]}function jr(n,r,t){var e,u;if(r=Fn(r,t),er(n))for(e=0,u=n.length;e<u;e++)r(n[e],e,n);else{var o=nn(n);for(e=0,u=o.length;e<u;e++)r(n[o[e]],o[e],n)}return n}function _r(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=Array(u),i=0;i<u;i++){var a=e?e[i]:i;o[i]=r(n[a],a,n)}return o}function wr(n){var r=function(r,t,e,u){var o=!er(r)&&nn(r),i=(o||r).length,a=n>0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a<i;a+=n){var f=o?o[a]:a;e=t(e,r[f],f,r)}return e};return function(n,t,e,u){var o=arguments.length>=3;return r(n,Fn(t,u,4),e,o)}}var Ar=wr(1),xr=wr(-1);function Sr(n,r,t){var e=[];return r=qn(r,t),jr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Or(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o<u;o++){var i=e?e[o]:o;if(!r(n[i],i,n))return!1}return!0}function Mr(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o<u;o++){var i=e?e[o]:o;if(r(n[i],i,n))return!0}return!1}function Er(n,r,t,e){return er(n)||(n=jn(n)),("number"!=typeof t||e)&&(t=0),gr(n,r,t)>=0}var Br=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Nn(r),e=r.slice(0,-1),r=r[r.length-1]),_r(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=In(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Nr(n,r){return _r(n,Rn(r))}function Ir(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;a<f;a++)null!=(e=n[a])&&e>o&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}function Tr(n,r,t){if(null==r||t)return er(n)||(n=jn(n)),n[Wn(n.length-1)];var e=er(n)?En(n):jn(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i<r;i++){var a=Wn(i,o),f=e[i];e[i]=e[a],e[a]=f}return e.slice(0,r)}function kr(n,r){return function(t,e,u){var o=r?[[],[]]:{};return e=qn(e,u),jr(t,(function(r,u){var i=e(r,u,t);n(o,r,i)})),o}}var Dr=kr((function(n,r,t){W(n,t)?n[t].push(r):n[t]=[r]})),Rr=kr((function(n,r,t){n[t]=r})),Fr=kr((function(n,r,t){W(n,t)?n[t]++:n[t]=1})),Vr=kr((function(n,r,t){n[t?0:1].push(r)}),!0),Pr=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function qr(n,r,t){return r in t}var Ur=j((function(n,r){var t={},e=r[0];if(null==n)return t;D(e)?(r.length>1&&(e=Fn(e,r[1])),r=an(n)):(e=qr,r=ur(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u<o;u++){var i=r[u],a=n[i];e(a,i,n)&&(t[i]=a)}return t})),Wr=j((function(n,r){var t,e=r[0];return D(e)?(e=fr(e),r.length>1&&(t=r[1])):(r=_r(ur(r,!1,!1),String),e=function(n,t){return!Er(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=ur(r,!0,!0),Sr(n,(function(n){return!Er(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u=[],o=[],i=0,a=Y(n);i<a;i++){var f=n[i],c=t?t(f,i,n):f;r&&!t?(i&&o===c||u.push(f),o=c):t?Er(o,c)||(o.push(c),u.push(f)):Er(u,f)||u.push(f)}return u}var Gr=j((function(n){return Jr(ur(n,!0,!0))}));function Hr(n){for(var r=n&&Ir(n,Y).length||0,t=Array(r),e=0;e<r;e++)t[e]=Nr(n,e);return t}var Qr=j(Hr);function Xr(n,r){return n._chain?tn(r).chain():r}function Yr(n){return jr(wn(n),(function(r){var t=tn[r]=n[r];tn.prototype[r]=function(){var n=[this._wrapped];return o.apply(n,arguments),Xr(this,t.apply(tn,n))}})),tn}jr(["pop","push","reverse","shift","sort","splice","unshift"],(function(n){var r=t[n];tn.prototype[n]=function(){var t=this._wrapped;return null!=t&&(r.apply(t,arguments),"shift"!==n&&"splice"!==n||0!==t.length||delete t[0]),Xr(this,t)}})),jr(["concat","join","slice"],(function(n){var r=t[n];tn.prototype[n]=function(){var n=this._wrapped;return null!=n&&(n=r.apply(n,arguments)),Xr(this,n)}}));var Zr=Yr({__proto__:null,VERSION:n,restArguments:j,isObject:_,isNull:function(n){return null===n},isUndefined:w,isBoolean:A,isElement:function(n){return!(!n||1!==n.nodeType)},isString:S,isNumber:O,isDate:M,isRegExp:E,isError:B,isSymbol:N,isArrayBuffer:I,isDataView:q,isArray:U,isFunction:D,isArguments:L,isFinite:function(n){return!N(n)&&d(n)&&!isNaN(parseFloat(n))},isNaN:$,isTypedArray:X,isEmpty:function(n){if(null==n)return!0;var r=Y(n);return"number"==typeof r&&(U(n)||S(n)||L(n))?0===r:0===Y(nn(n))},isMatch:rn,isEqual:function(n,r){return on(n,r)},isMap:dn,isWeakMap:gn,isSet:bn,isWeakSet:mn,keys:nn,allKeys:an,values:jn,pairs:function(n){for(var r=nn(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=[r[u],n[r[u]]];return e},invert:_n,functions:wn,methods:wn,extend:xn,extendOwn:Sn,assign:Sn,defaults:On,create:function(n,r){var t=Mn(n);return r&&Sn(t,r),t},clone:En,tap:function(n,r){return r(n),n},get:Tn,has:function(n,r){for(var t=(r=Nn(r)).length,e=0;e<t;e++){var u=r[e];if(!W(n,u))return!1;n=n[u]}return!!t},mapObject:function(n,r,t){r=qn(r,t);for(var e=nn(n),u=e.length,o={},i=0;i<u;i++){var a=e[i];o[a]=r(n[a],a,n)}return o},identity:kn,constant:C,noop:Un,toPath:Bn,property:Rn,propertyOf:function(n){return null==n?Un:function(r){return Tn(n,r)}},matcher:Dn,matches:Dn,times:function(n,r,t){var e=Array(Math.max(0,n));r=Fn(r,t,1);for(var u=0;u<n;u++)e[u]=r(u);return e},random:Wn,now:zn,escape:Cn,unescape:Kn,templateSettings:Jn,template:function(n,r,t){!r&&t&&(r=t),r=On({},r,tn.templateSettings);var e=RegExp([(r.escape||Gn).source,(r.interpolate||Gn).source,(r.evaluate||Gn).source].join("|")+"|$","g"),u=0,o="__p+='";n.replace(e,(function(r,t,e,i,a){return o+=n.slice(u,a).replace(Qn,Xn),u=a+r.length,t?o+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":e?o+="'+\n((__t=("+e+"))==null?'':__t)+\n'":i&&(o+="';\n"+i+"\n__p+='"),r})),o+="';\n";var i,a=r.variable;if(a){if(!Yn.test(a))throw new Error("variable is not a bare identifier: "+a)}else o="with(obj||{}){\n"+o+"}\n",a="obj";o="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{i=new Function(a,"_",o)}catch(n){throw n.source=o,n}var f=function(n){return i.call(this,n,tn)};return f.source="function("+a+"){\n"+o+"}",f},result:function(n,r,t){var e=(r=Nn(r)).length;if(!e)return D(t)?t.call(n):t;for(var u=0;u<e;u++){var o=null==n?void 0:n[r[u]];void 0===o&&(o=t,u=e),n=D(o)?o.call(n):o}return n},uniqueId:function(n){var r=++Zn+"";return n?n+r:r},chain:function(n){var r=tn(n);return r._chain=!0,r},iteratee:Pn,partial:rr,bind:tr,bindAll:or,memoize:function(n,r){var t=function(e){var u=t.cache,o=""+(r?r.apply(this,arguments):e);return W(u,o)||(u[o]=n.apply(this,arguments)),u[o]};return t.cache={},t},delay:ir,defer:ar,throttle:function(n,r,t){var e,u,o,i,a=0;t||(t={});var f=function(){a=!1===t.leading?0:zn(),e=null,i=n.apply(u,o),e||(u=o=null)},c=function(){var c=zn();a||!1!==t.leading||(a=c);var l=r-(c-a);return u=this,o=arguments,l<=0||l>r?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=zn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=zn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return rr(r,n)},negate:fr,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:cr,once:lr,findKey:sr,findIndex:vr,findLastIndex:hr,sortedIndex:yr,indexOf:gr,lastIndexOf:br,find:mr,detect:mr,findWhere:function(n,r){return mr(n,Dn(r))},each:jr,forEach:jr,map:_r,collect:_r,reduce:Ar,foldl:Ar,inject:Ar,reduceRight:xr,foldr:xr,filter:Sr,select:Sr,reject:function(n,r,t){return Sr(n,fr(qn(r)),t)},every:Or,all:Or,some:Mr,any:Mr,contains:Er,includes:Er,include:Er,invoke:Br,pluck:Nr,where:function(n,r){return Sr(n,Dn(r))},max:Ir,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;a<f;a++)null!=(e=n[a])&&e<o&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))<i||u===1/0&&o===1/0)&&(o=n,i=u)}));return o},shuffle:function(n){return Tr(n,1/0)},sample:Tr,sortBy:function(n,r,t){var e=0;return r=qn(r,t),Nr(_r(n,(function(n,t,u){return{value:n,index:e++,criteria:r(n,t,u)}})).sort((function(n,r){var t=n.criteria,e=r.criteria;if(t!==e){if(t>e||void 0===t)return 1;if(t<e||void 0===e)return-1}return n.index-r.index})),"value")},groupBy:Dr,indexBy:Rr,countBy:Fr,partition:Vr,toArray:function(n){return n?U(n)?i.call(n):S(n)?n.match(Pr):er(n)?_r(n,kn):jn(n):[]},size:function(n){return null==n?0:er(n)?n.length:nn(n).length},pick:Ur,omit:Wr,first:Lr,head:Lr,take:Lr,initial:zr,last:function(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[n.length-1]:$r(n,Math.max(0,n.length-r))},rest:$r,tail:$r,drop:$r,compact:function(n){return Sr(n,Boolean)},flatten:function(n,r){return ur(n,r,!1)},without:Kr,uniq:Jr,unique:Jr,union:Gr,intersection:function(n){for(var r=[],t=arguments.length,e=0,u=Y(n);e<u;e++){var o=n[e];if(!Er(r,o)){var i;for(i=1;i<t&&Er(arguments[i],o);i++);i===t&&r.push(o)}}return r},difference:Cr,unzip:Hr,transpose:Hr,zip:Qr,object:function(n,r){for(var t={},e=0,u=Y(n);e<u;e++)r?t[n[e]]=r[e]:t[n[e][0]]=n[e][1];return t},range:function(n,r,t){null==r&&(r=n||0,n=0),t||(t=r<n?-1:1);for(var e=Math.max(Math.ceil((r-n)/t),0),u=Array(e),o=0;o<e;o++,n+=t)u[o]=n;return u},chunk:function(n,r){if(null==r||r<1)return[];for(var t=[],e=0,u=n.length;e<u;)t.push(i.call(n,e,e+=r));return t},mixin:Yr,default:tn});return Zr._=Zr,Zr}));
|
@@ -0,0 +1,235 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'docurium'
|
3
|
+
require 'rugged'
|
4
|
+
|
5
|
+
class DocuriumTest < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@dir = Dir.mktmpdir()
|
9
|
+
|
10
|
+
@repo = Rugged::Repository.init_at(@dir, :bare)
|
11
|
+
|
12
|
+
# Create an index as we would have read from the user's repository
|
13
|
+
index = Rugged::Index.new
|
14
|
+
headers = File.dirname(__FILE__) + '/fixtures/git2/'
|
15
|
+
Dir.entries(headers).each do |rel_path|
|
16
|
+
path = File.join(headers, rel_path)
|
17
|
+
next if File.directory? path
|
18
|
+
id = @repo.write(File.read(path), :blob)
|
19
|
+
index.add(:path => rel_path, :oid => id, :mode => 0100644)
|
20
|
+
end
|
21
|
+
|
22
|
+
@path = File.dirname(__FILE__) + '/fixtures/git2/api.docurium'
|
23
|
+
@doc = Docurium.new(@path, {}, @repo)
|
24
|
+
@data = @doc.parse_headers(index, 'HEAD')
|
25
|
+
end
|
26
|
+
|
27
|
+
def teardown
|
28
|
+
FileUtils.remove_entry(@dir)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_can_parse
|
32
|
+
refute_nil @data
|
33
|
+
assert_equal [:files, :functions, :callbacks, :globals, :types, :prefix, :groups], @data.keys
|
34
|
+
files = %w(blob.h callback.h cherrypick.h commit.h common.h errors.h index.h object.h odb.h odb_backend.h oid.h refs.h repository.h revwalk.h signature.h tag.h tree.h types.h)
|
35
|
+
assert_equal files, @data[:files].map {|d| d[:file] }
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_can_parse_headers
|
39
|
+
keys = @data.keys.map { |k| k.to_s }.sort
|
40
|
+
assert_equal ['callbacks', 'files', 'functions', 'globals', 'groups', 'prefix', 'types'], keys
|
41
|
+
assert_equal 155, @data[:functions].size
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_can_extract_enum_from_define
|
45
|
+
skip("this isn't something we do")
|
46
|
+
assert_equal 41, @data[:globals].size
|
47
|
+
idxentry = @data[:types].find { |a| a[0] == 'GIT_IDXENTRY' }
|
48
|
+
assert idxentry
|
49
|
+
assert_equal 75, idxentry[1][:lineto]
|
50
|
+
# this one is on the last doc block
|
51
|
+
assert idxentry[1][:block].include? 'GIT_IDXENTRY_EXTENDED2'
|
52
|
+
# from an earlier block, should not get overwritten
|
53
|
+
assert idxentry[1][:block].include? 'GIT_IDXENTRY_UPDATE'
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_can_extract_structs_and_enums
|
57
|
+
skip("we don't auto-create enums, so the number is wrong")
|
58
|
+
assert_equal 25, @data[:types].size
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_can_find_type_usage
|
62
|
+
oid = @data[:types].find {|a| a[0] == 'git_oid' }
|
63
|
+
oid_returns = [
|
64
|
+
"git_commit_id",
|
65
|
+
"git_commit_parent_oid",
|
66
|
+
"git_commit_tree_oid",
|
67
|
+
"git_object_id",
|
68
|
+
"git_odb_object_id",
|
69
|
+
"git_oid_shorten_new",
|
70
|
+
"git_reference_oid",
|
71
|
+
"git_tag_id",
|
72
|
+
"git_tag_target_oid",
|
73
|
+
"git_tree_entry_id",
|
74
|
+
"git_tree_id"
|
75
|
+
]
|
76
|
+
assert_equal oid_returns, oid[1][:used][:returns]
|
77
|
+
oid_needs = [
|
78
|
+
"git_blob_create_frombuffer",
|
79
|
+
"git_blob_create_fromfile",
|
80
|
+
"git_blob_lookup",
|
81
|
+
"git_commit_create",
|
82
|
+
"git_commit_create_o",
|
83
|
+
"git_commit_create_ov",
|
84
|
+
"git_commit_create_v",
|
85
|
+
"git_commit_lookup",
|
86
|
+
"git_object_lookup",
|
87
|
+
"git_odb_exists",
|
88
|
+
"git_odb_hash",
|
89
|
+
"git_odb_open_rstream",
|
90
|
+
"git_odb_read",
|
91
|
+
"git_odb_read_header",
|
92
|
+
"git_odb_write",
|
93
|
+
"git_oid_allocfmt",
|
94
|
+
"git_oid_cmp",
|
95
|
+
"git_oid_cpy",
|
96
|
+
"git_oid_fmt",
|
97
|
+
"git_oid_mkraw",
|
98
|
+
"git_oid_mkstr",
|
99
|
+
"git_oid_pathfmt",
|
100
|
+
"git_oid_shorten_add",
|
101
|
+
"git_oid_shorten_free",
|
102
|
+
"git_oid_to_string",
|
103
|
+
"git_reference_create_oid",
|
104
|
+
"git_reference_create_oid_f",
|
105
|
+
"git_reference_set_oid",
|
106
|
+
"git_revwalk_hide",
|
107
|
+
"git_revwalk_next",
|
108
|
+
"git_revwalk_push",
|
109
|
+
"git_tag_create",
|
110
|
+
"git_tag_create_f",
|
111
|
+
"git_tag_create_fo",
|
112
|
+
"git_tag_create_frombuffer",
|
113
|
+
"git_tag_create_o",
|
114
|
+
"git_tag_lookup",
|
115
|
+
"git_tree_create_fromindex",
|
116
|
+
"git_tree_lookup",
|
117
|
+
"git_treebuilder_insert",
|
118
|
+
"git_treebuilder_write"
|
119
|
+
]
|
120
|
+
assert_equal oid_needs, oid[1][:used][:needs].sort
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_can_parse_normal_functions
|
124
|
+
func = @data[:functions]['git_blob_rawcontent']
|
125
|
+
assert_equal "<p>Get a read-only buffer with the raw content of a blob.</p>\n", func[:description]
|
126
|
+
assert_equal 'const void *', func[:return][:type]
|
127
|
+
assert_equal ' the pointer; NULL if the blob has no contents', func[:return][:comment]
|
128
|
+
assert_equal 84, func[:line]
|
129
|
+
assert_equal 84, func[:lineto]
|
130
|
+
assert_equal 'blob.h', func[:file]
|
131
|
+
assert_equal 'git_blob *blob',func[:argline]
|
132
|
+
assert_equal 'blob', func[:args][0][:name]
|
133
|
+
assert_equal 'git_blob *', func[:args][0][:type]
|
134
|
+
assert_equal 'pointer to the blob', func[:args][0][:comment]
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_can_parse_defined_functions
|
138
|
+
func = @data[:functions]['git_tree_lookup']
|
139
|
+
assert_equal 'int', func[:return][:type]
|
140
|
+
assert_equal ' 0 on success; error code otherwise', func[:return][:comment]
|
141
|
+
assert_equal 50, func[:line]
|
142
|
+
assert_equal 'tree.h', func[:file]
|
143
|
+
assert_equal 'id', func[:args][2][:name]
|
144
|
+
assert_equal 'const git_oid *', func[:args][2][:type]
|
145
|
+
assert_equal 'identity of the tree to locate.', func[:args][2][:comment]
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_can_parse_function_cast_args
|
149
|
+
func = @data[:functions]['git_reference_listcb']
|
150
|
+
assert_equal 'int', func[:return][:type]
|
151
|
+
assert_equal ' 0 on success; error code otherwise', func[:return][:comment]
|
152
|
+
assert_equal 321, func[:line]
|
153
|
+
assert_equal 'refs.h', func[:file]
|
154
|
+
assert_equal 'repo', func[:args][0][:name]
|
155
|
+
assert_equal 'git_repository *', func[:args][0][:type]
|
156
|
+
assert_equal 'list_flags', func[:args][1][:name]
|
157
|
+
assert_equal 'unsigned int', func[:args][1][:type]
|
158
|
+
assert_equal 'callback', func[:args][2][:name]
|
159
|
+
assert_equal 'int (*)(const char *, void *)', func[:args][2][:type]
|
160
|
+
assert_equal 'Function which will be called for every listed ref', func[:args][2][:comment]
|
161
|
+
expect_comment =<<-EOF
|
162
|
+
<p>The listed references may be filtered by type, or using
|
163
|
+
a bitwise OR of several types. Use the magic value
|
164
|
+
<code>GIT_REF_LISTALL</code> to obtain all references, including
|
165
|
+
packed ones.</p>
|
166
|
+
|
167
|
+
<p>The <code>callback</code> function will be called for each of the references
|
168
|
+
in the repository, and will receive the name of the reference and
|
169
|
+
the <code>payload</code> value passed to this method.</p>
|
170
|
+
EOF
|
171
|
+
assert_equal expect_comment.split("\n"), func[:comments].split("\n")
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_can_handle_bulleted_lists
|
175
|
+
type = @data[:types].find {|name, data| name == 'git_repository_init_options' }
|
176
|
+
refute_nil type
|
177
|
+
expect_comment = <<-EOF
|
178
|
+
<p>This contains extra options for <code>git_repository_init_ext</code> that enable
|
179
|
+
additional initialization features. The fields are:</p>
|
180
|
+
|
181
|
+
<ul>
|
182
|
+
<li>flags - Combination of GIT_REPOSITORY_INIT flags above.</li>
|
183
|
+
<li>mode - Set to one of the standard GIT_REPOSITORY_INIT_SHARED_...
|
184
|
+
constants above, or to a custom value that you would like.</li>
|
185
|
+
<li>workdir_path - The path to the working dir or NULL for default (i.e.
|
186
|
+
repo_path parent on non-bare repos). IF THIS IS RELATIVE PATH,
|
187
|
+
IT WILL BE EVALUATED RELATIVE TO THE REPO_PATH. If this is not
|
188
|
+
the "natural" working directory, a .git gitlink file will be
|
189
|
+
created here linking to the repo_path.</li>
|
190
|
+
<li>description - If set, this will be used to initialize the "description"
|
191
|
+
file in the repository, instead of using the template content.</li>
|
192
|
+
<li>template_path - When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set,
|
193
|
+
this contains the path to use for the template directory. If
|
194
|
+
this is NULL, the config or default directory options will be
|
195
|
+
used instead.</li>
|
196
|
+
<li>initial_head - The name of the head to point HEAD at. If NULL, then
|
197
|
+
this will be treated as "master" and the HEAD ref will be set
|
198
|
+
to "refs/heads/master". If this begins with "refs/" it will be
|
199
|
+
used verbatim; otherwise "refs/heads/" will be prefixed.</li>
|
200
|
+
<li>origin_url - If this is non-NULL, then after the rest of the
|
201
|
+
repository initialization is completed, an "origin" remote
|
202
|
+
will be added pointing to this URL.</li>
|
203
|
+
</ul>
|
204
|
+
EOF
|
205
|
+
assert_equal expect_comment, type[1][:comments]
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_can_get_the_full_description_from_multi_liners
|
209
|
+
func = @data[:functions]['git_commit_create_o']
|
210
|
+
desc = "<p>Create a new commit in the repository using <code>git_object</code>\n instances as parameters.</p>\n"
|
211
|
+
assert_equal desc, func[:description]
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_can_group_functions
|
215
|
+
groups = %w(blob cherrypick commit index lasterror object odb oid reference repository revwalk signature strerror tag tree treebuilder work)
|
216
|
+
assert_equal groups, @data[:groups].map {|g| g[0]}.sort
|
217
|
+
group, funcs = @data[:groups].first
|
218
|
+
assert_equal 'blob', group
|
219
|
+
assert_equal 6, funcs.size
|
220
|
+
end
|
221
|
+
|
222
|
+
def test_can_store_mutliple_enum_doc_sections
|
223
|
+
skip("this isn't something we do")
|
224
|
+
idxentry = @data[:types].find { |a| a[0] == 'GIT_IDXENTRY' }
|
225
|
+
assert idxentry, "GIT_IDXENTRY did not get automatically created"
|
226
|
+
assert_equal 2, idxentry[1][:sections].size
|
227
|
+
end
|
228
|
+
|
229
|
+
def test_can_parse_callback
|
230
|
+
cb = @data[:callbacks]['git_callback_do_work']
|
231
|
+
# we can mostly assume that the rest works as it's the same as for the functions
|
232
|
+
assert_equal 'int', cb[:return][:type]
|
233
|
+
end
|
234
|
+
|
235
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#ifndef INCLUDE_git_blob_h__
|
2
|
+
#define INCLUDE_git_blob_h__
|
3
|
+
|
4
|
+
#include "common.h"
|
5
|
+
#include "types.h"
|
6
|
+
|
7
|
+
GIT_BEGIN_DECL
|
8
|
+
|
9
|
+
/**
|
10
|
+
* Perform a cherry-pick
|
11
|
+
*
|
12
|
+
* @param input dummy input
|
13
|
+
* @returns the usual
|
14
|
+
*/
|
15
|
+
GIT_EXTERN(int) git_cherrypick(char *input);
|
16
|
+
|
17
|
+
GIT_END_DECL
|
18
|
+
|
19
|
+
#endif
|
data/test/fixtures/git2/common.h
CHANGED
@@ -212,6 +212,45 @@ GIT_EXTERN(const char *) git_repository_path(git_repository *repo);
|
|
212
212
|
*/
|
213
213
|
GIT_EXTERN(const char *) git_repository_workdir(git_repository *repo);
|
214
214
|
|
215
|
+
/**
|
216
|
+
* Extended options structure for `git_repository_init_ext`.
|
217
|
+
*
|
218
|
+
* This contains extra options for `git_repository_init_ext` that enable
|
219
|
+
* additional initialization features. The fields are:
|
220
|
+
*
|
221
|
+
* * flags - Combination of GIT_REPOSITORY_INIT flags above.
|
222
|
+
* * mode - Set to one of the standard GIT_REPOSITORY_INIT_SHARED_...
|
223
|
+
* constants above, or to a custom value that you would like.
|
224
|
+
* * workdir_path - The path to the working dir or NULL for default (i.e.
|
225
|
+
* repo_path parent on non-bare repos). IF THIS IS RELATIVE PATH,
|
226
|
+
* IT WILL BE EVALUATED RELATIVE TO THE REPO_PATH. If this is not
|
227
|
+
* the "natural" working directory, a .git gitlink file will be
|
228
|
+
* created here linking to the repo_path.
|
229
|
+
* * description - If set, this will be used to initialize the "description"
|
230
|
+
* file in the repository, instead of using the template content.
|
231
|
+
* * template_path - When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set,
|
232
|
+
* this contains the path to use for the template directory. If
|
233
|
+
* this is NULL, the config or default directory options will be
|
234
|
+
* used instead.
|
235
|
+
* * initial_head - The name of the head to point HEAD at. If NULL, then
|
236
|
+
* this will be treated as "master" and the HEAD ref will be set
|
237
|
+
* to "refs/heads/master". If this begins with "refs/" it will be
|
238
|
+
* used verbatim; otherwise "refs/heads/" will be prefixed.
|
239
|
+
* * origin_url - If this is non-NULL, then after the rest of the
|
240
|
+
* repository initialization is completed, an "origin" remote
|
241
|
+
* will be added pointing to this URL.
|
242
|
+
*/
|
243
|
+
typedef struct {
|
244
|
+
unsigned int version;
|
245
|
+
uint32_t flags;
|
246
|
+
uint32_t mode;
|
247
|
+
const char *workdir_path;
|
248
|
+
const char *description;
|
249
|
+
const char *template_path;
|
250
|
+
const char *initial_head;
|
251
|
+
const char *origin_url;
|
252
|
+
} git_repository_init_options;
|
253
|
+
|
215
254
|
/** @} */
|
216
255
|
GIT_END_DECL
|
217
256
|
#endif
|
data/test/fixtures/git2/types.h
CHANGED
data/test/gen_test.rb
CHANGED
@@ -3,7 +3,7 @@ require 'docurium'
|
|
3
3
|
require 'docurium/cli'
|
4
4
|
require 'tempfile'
|
5
5
|
|
6
|
-
class GenTest <
|
6
|
+
class GenTest < Minitest::Test
|
7
7
|
|
8
8
|
# make sure we can read what we give the user
|
9
9
|
def test_read_generated_file
|
@@ -12,7 +12,7 @@ class GenTest < MiniTest::Unit::TestCase
|
|
12
12
|
Docurium::CLI.gen(file.path)
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
assert_raises(Rugged::RepositoryError) { Docurium.new file.path }
|
16
16
|
end
|
17
17
|
|
18
18
|
end
|
data/test/parser_test.rb
CHANGED
@@ -2,15 +2,19 @@ require 'minitest/autorun'
|
|
2
2
|
require 'docurium'
|
3
3
|
require 'pp'
|
4
4
|
|
5
|
-
class
|
5
|
+
class ParserTest < Minitest::Test
|
6
6
|
|
7
|
-
def
|
8
|
-
@parser
|
7
|
+
def teardown
|
8
|
+
@parser.cleanup! if @parser
|
9
9
|
end
|
10
10
|
|
11
11
|
# e.g. parse('git2/refs.h')
|
12
|
+
# contents is either a string (the contents of "path")
|
13
|
+
# or a hash of paths => contents
|
12
14
|
def parse(path, contents)
|
13
|
-
|
15
|
+
contents = [[path, contents]] if contents.is_a? String
|
16
|
+
@parser = Docurium::DocParser.new(contents)
|
17
|
+
@parser.parse_file(path)
|
14
18
|
end
|
15
19
|
|
16
20
|
def test_single_function
|
@@ -70,7 +74,7 @@ EOF
|
|
70
74
|
*/
|
71
75
|
int some_function(
|
72
76
|
char *string,
|
73
|
-
|
77
|
+
int len);
|
74
78
|
EOF
|
75
79
|
|
76
80
|
actual = parse(name, contents)
|
@@ -80,10 +84,10 @@ EOF
|
|
80
84
|
:tdef => nil,
|
81
85
|
:type => :function,
|
82
86
|
:name => 'some_function',
|
83
|
-
:body => "int some_function(char *string,
|
87
|
+
:body => "int some_function(char *string, int len);",
|
84
88
|
:description => ' Do something',
|
85
89
|
:comments => " More explanation of what we do\n\n ",
|
86
|
-
:sig => 'char *::
|
90
|
+
:sig => 'char *::int',
|
87
91
|
:args => [{
|
88
92
|
:name => 'string',
|
89
93
|
:type => 'char *',
|
@@ -91,15 +95,15 @@ EOF
|
|
91
95
|
},
|
92
96
|
{
|
93
97
|
:name => 'len',
|
94
|
-
:type => '
|
98
|
+
:type => 'int',
|
95
99
|
:comment => nil
|
96
100
|
}],
|
97
101
|
:return => {
|
98
102
|
:type => 'int',
|
99
103
|
:comment => ' an integer value'
|
100
104
|
},
|
101
|
-
:decl => "int some_function(char *string,
|
102
|
-
:argline => "char *string,
|
105
|
+
:decl => "int some_function(char *string, int len)",
|
106
|
+
:argline => "char *string, int len",
|
103
107
|
}]
|
104
108
|
|
105
109
|
assert_equal expected, actual
|
@@ -122,7 +126,7 @@ EOF
|
|
122
126
|
GIT_EXTERN(int) some_public_function(int val);
|
123
127
|
EOF
|
124
128
|
|
125
|
-
actual =
|
129
|
+
actual = parse(name_b, [[name_a, contents_a], [name_b, contents_b]])
|
126
130
|
# "Fix" the path so we remove the temp dir
|
127
131
|
actual[0][:file] = File.split(actual[0][:file])[-1]
|
128
132
|
|
@@ -192,7 +196,7 @@ EOF
|
|
192
196
|
:argline => "git_tree *tree"
|
193
197
|
}]
|
194
198
|
|
195
|
-
assert_equal
|
199
|
+
assert_equal expected, actual
|
196
200
|
|
197
201
|
end
|
198
202
|
|
@@ -377,7 +381,7 @@ EOF
|
|
377
381
|
:underlying_type => "int"
|
378
382
|
}]
|
379
383
|
|
380
|
-
assert_equal
|
384
|
+
assert_equal expected, actual
|
381
385
|
|
382
386
|
name = 'typeref.h'
|
383
387
|
contents = <<EOF
|
@@ -401,7 +405,7 @@ EOF
|
|
401
405
|
:comments => '',
|
402
406
|
}]
|
403
407
|
|
404
|
-
assert_equal
|
408
|
+
assert_equal expected, actual
|
405
409
|
|
406
410
|
|
407
411
|
end
|