pcottle.learnGitBranching/build/bundle.min.js

1 line
No EOL
588 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function(){var e=function(t,n){var r=e.resolve(t,n||"/"),i=e.modules[r];if(!i)throw new Error("Failed to resolve module "+t+", tried "+r);var s=e.cache[r],o=s?s.exports:i();return o};e.paths=[],e.modules={},e.cache={},e.extensions=[".js",".coffee",".json"],e._core={assert:!0,events:!0,fs:!0,path:!0,vm:!0},e.resolve=function(){return function(t,n){function u(t){t=r.normalize(t);if(e.modules[t])return t;for(var n=0;n<e.extensions.length;n++){var i=e.extensions[n];if(e.modules[t+i])return t+i}}function a(t){t=t.replace(/\/+$/,"");var n=r.normalize(t+"/package.json");if(e.modules[n]){var i=e.modules[n](),s=i.browserify;if(typeof s=="object"&&s.main){var o=u(r.resolve(t,s.main));if(o)return o}else if(typeof s=="string"){var o=u(r.resolve(t,s));if(o)return o}else if(i.main){var o=u(r.resolve(t,i.main));if(o)return o}}return u(t+"/index")}function f(e,t){var n=l(t);for(var r=0;r<n.length;r++){var i=n[r],s=u(i+"/"+e);if(s)return s;var o=a(i+"/"+e);if(o)return o}var s=u(e);if(s)return s}function l(e){var t;e==="/"?t=[""]:t=r.normalize(e).split("/");var n=[];for(var i=t.length-1;i>=0;i--){if(t[i]==="node_modules")continue;var s=t.slice(0,i+1).join("/")+"/node_modules";n.push(s)}return n}n||(n="/");if(e._core[t])return t;var r=e.modules.path();n=r.resolve("/",n);var i=n||"/";if(t.match(/^(?:\.\.?\/|\/)/)){var s=u(r.resolve(i,t))||a(r.resolve(i,t));if(s)return s}var o=f(t,i);if(o)return o;throw new Error("Cannot find module '"+t+"'")}}(),e.alias=function(t,n){var r=e.modules.path(),i=null;try{i=e.resolve(t+"/package.json","/")}catch(s){i=e.resolve(t,"/")}var o=r.dirname(i),u=(Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t})(e.modules);for(var a=0;a<u.length;a++){var f=u[a];if(f.slice(0,o.length+1)===o+"/"){var l=f.slice(o.length);e.modules[n+l]=e.modules[o+l]}else f===o&&(e.modules[n]=e.modules[o])}},function(){var t={},n=typeof window!="undefined"?window:{},r=!1;e.define=function(i,s){!r&&e.modules.__browserify_process&&(t=e.modules.__browserify_process(),r=!0);var o=e._core[i]?"":e.modules.path().dirname(i),u=function(t){var n=e(t,o),r=e.cache[e.resolve(t,o)];return r&&r.parent===null&&(r.parent=a),n};u.resolve=function(t){return e.resolve(t,o)},u.modules=e.modules,u.define=e.define,u.cache=e.cache;var a={id:i,filename:i,exports:{},loaded:!1,parent:null};e.modules[i]=function(){return e.cache[i]=a,s.call(a.exports,u,a,a.exports,o,i,t,n),a.loaded=!0,a.exports}}}(),e.define("path",function(e,t,n,r,i,s,o){function u(e,t){var n=[];for(var r=0;r<e.length;r++)t(e[r],r,e)&&n.push(e[r]);return n}function a(e,t){var n=0;for(var r=e.length;r>=0;r--){var i=e[r];i=="."?e.splice(r,1):i===".."?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n--;n)e.unshift("..");return e}var f=/^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;n.resolve=function(){var e="",t=!1;for(var n=arguments.length;n>=-1&&!t;n--){var r=n>=0?arguments[n]:s.cwd();if(typeof r!="string"||!r)continue;e=r+"/"+e,t=r.charAt(0)==="/"}return e=a(u(e.split("/"),function(e){return!!e}),!t).join("/"),(t?"/":"")+e||"."},n.normalize=function(e){var t=e.charAt(0)==="/",n=e.slice(-1)==="/";return e=a(u(e.split("/"),function(e){return!!e}),!t).join("/"),!e&&!t&&(e="."),e&&n&&(e+="/"),(t?"/":"")+e},n.join=function(){var e=Array.prototype.slice.call(arguments,0);return n.normalize(u(e,function(e,t){return e&&typeof e=="string"}).join("/"))},n.dirname=function(e){var t=f.exec(e)[1]||"",n=!1;return t?t.length===1||n&&t.length<=3&&t.charAt(1)===":"?t:t.substring(0,t.length-1):"."},n.basename=function(e,t){var n=f.exec(e)[2]||"";return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},n.extname=function(e){return f.exec(e)[3]||""}}),e.define("__browserify_process",function(e,t,n,r,i,s,o){var s=t.exports={};s.nextTick=function(){var e=typeof window!="undefined"&&window.setImmediate,t=typeof window!="undefined"&&window.postMessage&&window.addEventListener;if(e)return function(e){return window.setImmediate(e)};if(t){var n=[];return window.addEventListener("message",function(e){if(e.source===window&&e.data==="browserify-tick"){e.stopPropagation();if(n.length>0){var t=n.shift();t()}}},!0),function(t){n.push(t),window.postMessage("browserify-tick","*")}}return function(t){setTimeout(t,0)}}(),s.title="browser",s.browser=!0,s.env={},s.argv=[],s.binding=function(t){if(t==="evals")return e("vm");throw new Error("No such module. (Possibly not yet loaded)")},function(){var t="/",n;s.cwd=function(){return t},s.chdir=function(r){n||(n=e("path")),t=n.resolve(r,t)}}()}),e.define("/node_modules/underscore/package.json",function(e,t,n,r,i,s,o){t.exports={main:"underscore.js"}}),e.define("/node_modules/underscore/underscore.js",function(e,t,n,r,i,s,o){(function(){var e=this,r=e._,i={},s=Array.prototype,o=Object.prototype,u=Function.prototype,a=s.push,f=s.slice,l=s.concat,c=o.toString,h=o.hasOwnProperty,p=s.forEach,d=s.map,v=s.reduce,m=s.reduceRight,g=s.filter,y=s.every,b=s.some,w=s.indexOf,E=s.lastIndexOf,S=Array.isArray,x=Object.keys,T=u.bind,N=function(e){if(e instanceof N)return e;if(!(this instanceof N))return new N(e);this._wrapped=e};typeof n!="undefined"?(typeof t!="undefined"&&t.exports&&(n=t.exports=N),n._=N):e._=N,N.VERSION="1.4.4";var C=N.each=N.forEach=function(e,t,n){if(e==null)return;if(p&&e.forEach===p)e.forEach(t,n);else if(e.length===+e.length){for(var r=0,s=e.length;r<s;r++)if(t.call(n,e[r],r,e)===i)return}else for(var o in e)if(N.has(e,o)&&t.call(n,e[o],o,e)===i)return};N.map=N.collect=function(e,t,n){var r=[];return e==null?r:d&&e.map===d?e.map(t,n):(C(e,function(e,i,s){r[r.length]=t.call(n,e,i,s)}),r)};var k="Reduce of empty array with no initial value";N.reduce=N.foldl=N.inject=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(v&&e.reduce===v)return r&&(t=N.bind(t,r)),i?e.reduce(t,n):e.reduce(t);C(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(k);return n},N.reduceRight=N.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(m&&e.reduceRight===m)return r&&(t=N.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=N.keys(e);s=o.length}C(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(k);return n},N.find=N.detect=function(e,t,n){var r;return L(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},N.filter=N.select=function(e,t,n){var r=[];return e==null?r:g&&e.filter===g?e.filter(t,n):(C(e,function(e,i,s){t.call(n,e,i,s)&&(r[r.length]=e)}),r)},N.reject=function(e,t,n){return N.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},N.every=N.all=function(e,t,n){t||(t=N.identity);var r=!0;return e==null?r:y&&e.every===y?e.every(t,n):(C(e,function(e,s,o){if(!(r=r&&t.call(n,e,s,o)))return i}),!!r)};var L=N.some=N.any=function(e,t,n){t||(t=N.identity);var r=!1;return e==null?r:b&&e.some===b?e.some(t,n):(C(e,function(e,s,o){if(r||(r=t.call(n,e,s,o)))return i}),!!r)};N.contains=N.include=function(e,t){return e==null?!1:w&&e.indexOf===w?e.indexOf(t)!=-1:L(e,function(e){return e===t})},N.invoke=function(e,t){var n=f.call(arguments,2),r=N.isFunction(t);return N.map(e,function(e){return(r?t:e[t]).apply(e,n)})},N.pluck=function(e,t){return N.map(e,function(e){return e[t]})},N.where=function(e,t,n){return N.isEmpty(t)?n?null:[]:N[n?"find":"filter"](e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},N.findWhere=function(e,t){return N.where(e,t,!0)},N.max=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&N.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},N.min=function(e,t,n){if(!t&&N.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&N.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return C(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o<r.computed&&(r={value:e,computed:o})}),r.value},N.shuffle=function(e){var t,n=0,r=[];return C(e,function(e){t=N.random(n++),r[n-1]=r[t],r[t]=e}),r};var A=function(e){return N.isFunction(e)?e:function(t){return t[e]}};N.sortBy=function(e,t,n){var r=A(t);return N.pluck(N.map(e,function(e,t,i){return{value:e,index:t,criteria:r.call(n,e,t,i)}}).sort(function(e,t){var n=e.criteria,r=t.criteria;if(n!==r){if(n>r||n===void 0)return 1;if(n<r||r===void 0)return-1}return e.index<t.index?-1:1}),"value")};var O=function(e,t,n,r){var i={},s=A(t||N.identity);return C(e,function(t,o){var u=s.call(n,t,o,e);r(i,u,t)}),i};N.groupBy=function(e,t,n){return O(e,t,n,function(e,t,n){(N.has(e,t)?e[t]:e[t]=[]).push(n)})},N.countBy=function(e,t,n){return O(e,t,n,function(e,t){N.has(e,t)||(e[t]=0),e[t]++})},N.sortedIndex=function(e,t,n,r){n=n==null?N.identity:A(n);var i=n.call(r,t),s=0,o=e.length;while(s<o){var u=s+o>>>1;n.call(r,e[u])<i?s=u+1:o=u}return s},N.toArray=function(e){return e?N.isArray(e)?f.call(e):e.length===+e.length?N.map(e,N.identity):N.values(e):[]},N.size=function(e){return e==null?0:e.length===+e.length?e.length:N.keys(e).length},N.first=N.head=N.take=function(e,t,n){return e==null?void 0:t!=null&&!n?f.call(e,0,t):e[0]},N.initial=function(e,t,n){return f.call(e,0,e.length-(t==null||n?1:t))},N.last=function(e,t,n){return e==null?void 0:t!=null&&!n?f.call(e,Math.max(e.length-t,0)):e[e.length-1]},N.rest=N.tail=N.drop=function(e,t,n){return f.call(e,t==null||n?1:t)},N.compact=function(e){return N.filter(e,N.identity)};var M=function(e,t,n){return C(e,function(e){N.isArray(e)?t?a.apply(n,e):M(e,t,n):n.push(e)}),n};N.flatten=function(e,t){return M(e,t,[])},N.without=function(e){return N.difference(e,f.call(arguments,1))},N.uniq=N.unique=function(e,t,n,r){N.isFunction(t)&&(r=n,n=t,t=!1);var i=n?N.map(e,n,r):e,s=[],o=[];return C(i,function(n,r){if(t?!r||o[o.length-1]!==n:!N.contains(o,n))o.push(n),s.push(e[r])}),s},N.union=function(){return N.uniq(l.apply(s,arguments))},N.intersection=function(e){var t=f.call(arguments,1);return N.filter(N.uniq(e),function(e){return N.every(t,function(t){return N.indexOf(t,e)>=0})})},N.difference=function(e){var t=l.apply(s,f.call(arguments,1));return N.filter(e,function(e){return!N.contains(t,e)})},N.zip=function(){var e=f.call(arguments),t=N.max(N.pluck(e,"length")),n=new Array(t);for(var r=0;r<t;r++)n[r]=N.pluck(e,""+r);return n},N.object=function(e,t){if(e==null)return{};var n={};for(var r=0,i=e.length;r<i;r++)t?n[e[r]]=t[r]:n[e[r][0]]=e[r][1];return n},N.indexOf=function(e,t,n){if(e==null)return-1;var r=0,i=e.length;if(n){if(typeof n!="number")return r=N.sortedIndex(e,t),e[r]===t?r:-1;r=n<0?Math.max(0,i+n):n}if(w&&e.indexOf===w)return e.indexOf(t,n);for(;r<i;r++)if(e[r]===t)return r;return-1},N.lastIndexOf=function(e,t,n){if(e==null)return-1;var r=n!=null;if(E&&e.lastIndexOf===E)return r?e.lastIndexOf(t,n):e.lastIndexOf(t);var i=r?n:e.length;while(i--)if(e[i]===t)return i;return-1},N.range=function(e,t,n){arguments.length<=1&&(t=e||0,e=0),n=arguments[2]||1;var r=Math.max(Math.ceil((t-e)/n),0),i=0,s=new Array(r);while(i<r)s[i++]=e,e+=n;return s},N.bind=function(e,t){if(e.bind===T&&T)return T.apply(e,f.call(arguments,1));var n=f.call(arguments,2);return function(){return e.apply(t,n.concat(f.call(arguments)))}},N.partial=function(e){var t=f.call(arguments,1);return function(){return e.apply(this,t.concat(f.call(arguments)))}},N.bindAll=function(e){var t=f.call(arguments,1);return t.length===0&&(t=N.functions(e)),C(t,function(t){e[t]=N.bind(e[t],e)}),e},N.memoize=function(e,t){var n={};return t||(t=N.identity),function(){var r=t.apply(this,arguments);return N.has(n,r)?n[r]:n[r]=e.apply(this,arguments)}},N.delay=function(e,t){var n=f.call(arguments,2);return setTimeout(function(){return e.apply(null,n)},t)},N.defer=function(e){return N.delay.apply(N,[e,1].concat(f.call(arguments,1)))},N.throttle=function(e,t){var n,r,i,s,o=0,u=function(){o=new Date,i=null,s=e.apply(n,r)};return function(){var a=new Date,f=t-(a-o);return n=this,r=arguments,f<=0?(clearTimeout(i),i=null,o=a,s=e.apply(n,r)):i||(i=setTimeout(u,f)),s}},N.debounce=function(e,t,n){var r,i;return function(){var s=this,o=arguments,u=function(){r=null,n||(i=e.apply(s,o))},a=n&&!r;return clearTimeout(r),r=setTimeout(u,t),a&&(i=e.apply(s,o)),i}},N.once=function(e){var t=!1,n;return function(){return t?n:(t=!0,n=e.apply(this,arguments),e=null,n)}},N.wrap=function(e,t){return function(){var n=[e];return a.apply(n,arguments),t.apply(this,n)}},N.compose=function(){var e=arguments;return function(){var t=arguments;for(var n=e.length-1;n>=0;n--)t=[e[n].apply(this,t)];return t[0]}},N.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},N.keys=x||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)N.has(e,n)&&(t[t.length]=n);return t},N.values=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push(e[n]);return t},N.pairs=function(e){var t=[];for(var n in e)N.has(e,n)&&t.push([n,e[n]]);return t},N.invert=function(e){var t={};for(var n in e)N.has(e,n)&&(t[e[n]]=n);return t},N.functions=N.methods=function(e){var t=[];for(var n in e)N.isFunction(e[n])&&t.push(n);return t.sort()},N.extend=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},N.pick=function(e){var t={},n=l.apply(s,f.call(arguments,1));return C(n,function(n){n in e&&(t[n]=e[n])}),t},N.omit=function(e){var t={},n=l.apply(s,f.call(arguments,1));for(var r in e)N.contains(n,r)||(t[r]=e[r]);return t},N.defaults=function(e){return C(f.call(arguments,1),function(t){if(t)for(var n in t)e[n]==null&&(e[n]=t[n])}),e},N.clone=function(e){return N.isObject(e)?N.isArray(e)?e.slice():N.extend({},e):e},N.tap=function(e,t){return t(e),e};var _=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof N&&(e=e._wrapped),t instanceof N&&(t=t._wrapped);var i=c.call(e);if(i!=c.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=_(e[o],t[o],n,r)))break}else{var a=e.constructor,f=t.constructor;if(a!==f&&!(N.isFunction(a)&&a instanceof a&&N.isFunction(f)&&f instanceof f))return!1;for(var l in e)if(N.has(e,l)){o++;if(!(u=N.has(t,l)&&_(e[l],t[l],n,r)))break}if(u){for(l in t)if(N.has(t,l)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};N.isEqual=function(e,t){return _(e,t,[],[])},N.isEmpty=function(e){if(e==null)return!0;if(N.isArray(e)||N.isString(e))return e.length===0;for(var t in e)if(N.has(e,t))return!1;return!0},N.isElement=function(e){return!!e&&e.nodeType===1},N.isArray=S||function(e){return c.call(e)=="[object Array]"},N.isObject=function(e){return e===Object(e)},C(["Arguments","Function","String","Number","Date","RegExp"],function(e){N["is"+e]=function(t){return c.call(t)=="[object "+e+"]"}}),N.isArguments(arguments)||(N.isArguments=function(e){return!!e&&!!N.has(e,"callee")}),typeof /./!="function"&&(N.isFunction=function(e){return typeof e=="function"}),N.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},N.isNaN=function(e){return N.isNumber(e)&&e!=+e},N.isBoolean=function(e){return e===!0||e===!1||c.call(e)=="[object Boolean]"},N.isNull=function(e){return e===null},N.isUndefined=function(e){return e===void 0},N.has=function(e,t){return h.call(e,t)},N.noConflict=function(){return e._=r,this},N.identity=function(e){return e},N.times=function(e,t,n){var r=Array(e);for(var i=0;i<e;i++)r[i]=t.call(n,i);return r},N.random=function(e,t){return t==null&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))};var D={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","/":"&#x2F;"}};D.unescape=N.invert(D.escape);var P={escape:new RegExp("["+N.keys(D.escape).join("")+"]","g"),unescape:new RegExp("("+N.keys(D.unescape).join("|")+")","g")};N.each(["escape","unescape"],function(e){N[e]=function(t){return t==null?"":(""+t).replace(P[e],function(t){return D[e][t]})}}),N.result=function(e,t){if(e==null)return null;var n=e[t];return N.isFunction(n)?n.call(e):n},N.mixin=function(e){C(N.functions(e),function(t){var n=N[t]=e[t];N.prototype[t]=function(){var e=[this._wrapped];return a.apply(e,arguments),I.call(this,n.apply(N,e))}})};var H=0;N.uniqueId=function(e){var t=++H+"";return e?e+t:t},N.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var B=/(.)^/,j={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},F=/\\|'|\r|\n|\t|\u2028|\u2029/g;N.template=function(e,t,n){var r;n=N.defaults({},n,N.templateSettings);var i=new RegExp([(n.escape||B).source,(n.interpolate||B).source,(n.evaluate||B).source].join("|")+"|$","g"),s=0,o="__p+='";e.replace(i,function(t,n,r,i,u){return o+=e.slice(s,u).replace(F,function(e){return"\\"+j[e]}),n&&(o+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(o+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),i&&(o+="';\n"+i+"\n__p+='"),s=u+t.length,t}),o+="';\n",n.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{r=new Function(n.variable||"obj","_",o)}catch(u){throw u.source=o,u}if(t)return r(t,N);var a=function(e){return r.call(this,e,N)};return a.source="function("+(n.variable||"obj")+"){\n"+o+"}",a},N.chain=function(e){return N(e).chain()};var I=function(e){return this._chain?N(e).chain():e};N.mixin(N),C(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=s[e];N.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],I.call(this,n)}}),C(["concat","join","slice"],function(e){var t=s[e];N.prototype[e]=function(){return I.call(this,t.apply(this._wrapped,arguments))}}),N.extend(N.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this)}),e.define("/node_modules/backbone/package.json",function(e,t,n,r,i,s,o){t.exports={main:"backbone.js"}}),e.define("/node_modules/backbone/backbone.js",function(e,t,n,r,i,s,o){(function(){var t=this,r=t.Backbone,i=[],s=i.push,o=i.slice,u=i.splice,a;typeof n!="undefined"?a=n:a=t.Backbone={},a.VERSION="0.9.10";var f=t._;!f&&typeof e!="undefined"&&(f=e("underscore")),a.$=t.jQuery||t.Zepto||t.ender,a.noConflict=function(){return t.Backbone=r,this},a.emulateHTTP=!1,a.emulateJSON=!1;var l=/\s+/,c=function(e,t,n,r){if(!n)return!0;if(typeof n=="object")for(var i in n)e[t].apply(e,[i,n[i]].concat(r));else{if(!l.test(n))return!0;var s=n.split(l);for(var o=0,u=s.length;o<u;o++)e[t].apply(e,[s[o]].concat(r))}},h=function(e,t){var n,r=-1,i=e.length;switch(t.length){case 0:while(++r<i)(n=e[r]).callback.call(n.ctx);return;case 1:while(++r<i)(n=e[r]).callback.call(n.ctx,t[0]);return;case 2:while(++r<i)(n=e[r]).callback.call(n.ctx,t[0],t[1]);return;case 3:while(++r<i)(n=e[r]).callback.call(n.ctx,t[0],t[1],t[2]);return;default:while(++r<i)(n=e[r]).callback.apply(n.ctx,t)}},p=a.Events={on:function(e,t,n){if(!c(this,"on",e,[t,n])||!t)return this;this._events||(this._events={});var r=this._events[e]||(this._events[e]=[]);return r.push({callback:t,context:n,ctx:n||this}),this},once:function(e,t,n){if(!c(this,"once",e,[t,n])||!t)return this;var r=this,i=f.once(function(){r.off(e,i),t.apply(this,arguments)});return i._callback=t,this.on(e,i,n),this},off:function(e,t,n){var r,i,s,o,u,a,l,h;if(!this._events||!c(this,"off",e,[t,n]))return this;if(!e&&!t&&!n)return this._events={},this;o=e?[e]:f.keys(this._events);for(u=0,a=o.length;u<a;u++){e=o[u];if(r=this._events[e]){s=[];if(t||n)for(l=0,h=r.length;l<h;l++)i=r[l],(t&&t!==i.callback&&t!==i.callback._callback||n&&n!==i.context)&&s.push(i);this._events[e]=s}}return this},trigger:function(e){if(!this._events)return this;var t=o.call(arguments,1);if(!c(this,"trigger",e,t))return this;var n=this._events[e],r=this._events.all;return n&&h(n,t),r&&h(r,arguments),this},listenTo:function(e,t,n){var r=this._listeners||(this._listeners={}),i=e._listenerId||(e._listenerId=f.uniqueId("l"));return r[i]=e,e.on(t,typeof t=="object"?this:n,this),this},stopListening:function(e,t,n){var r=this._listeners;if(!r)return;if(e)e.off(t,typeof t=="object"?this:n,this),!t&&!n&&delete r[e._listenerId];else{typeof t=="object"&&(n=this);for(var i in r)r[i].off(t,n,this);this._listeners={}}return this}};p.bind=p.on,p.unbind=p.off,f.extend(a,p);var d=a.Model=function(e,t){var n,r=e||{};this.cid=f.uniqueId("c"),this.attributes={},t&&t.collection&&(this.collection=t.collection),t&&t.parse&&(r=this.parse(r,t)||{});if(n=f.result(this,"defaults"))r=f.defaults({},r,n);this.set(r,t),this.changed={},this.initialize.apply(this,arguments)};f.extend(d.prototype,p,{changed:null,idAttribute:"id",initialize:function(){},toJSON:function(e){return f.clone(this.attributes)},sync:function(){return a.sync.apply(this,arguments)},get:function(e){return this.attributes[e]},escape:function(e){return f.escape(this.get(e))},has:function(e){return this.get(e)!=null},set:function(e,t,n){var r,i,s,o,u,a,l,c;if(e==null)return this;typeof e=="object"?(i=e,n=t):(i={})[e]=t,n||(n={});if(!this._validate(i,n))return!1;s=n.unset,u=n.silent,o=[],a=this._changing,this._changing=!0,a||(this._previousAttributes=f.clone(this.attributes),this.changed={}),c=this.attributes,l=this._previousAttributes,this.idAttribute in i&&(this.id=i[this.idAttribute]);for(r in i)t=i[r],f.isEqual(c[r],t)||o.push(r),f.isEqual(l[r],t)?delete this.changed[r]:this.changed[r]=t,s?delete c[r]:c[r]=t;if(!u){o.length&&(this._pending=!0);for(var h=0,p=o.length;h<p;h++)this.trigger("change:"+o[h],this,c[o[h]],n)}if(a)return this;if(!u)while(this._pending)this._pending=!1,this.trigger("change",this,n);return this._pending=!1,this._changing=!1,this},unset:function(e,t){return this.set(e,void 0,f.extend({},t,{unset:!0}))},clear:function(e){var t={};for(var n in this.attributes)t[n]=void 0;return this.set(t,f.extend({},e,{unset:!0}))},hasChanged:function(e){return e==null?!f.isEmpty(this.changed):f.has(this.changed,e)},changedAttributes:function(e){if(!e)return this.hasChanged()?f.clone(this.changed):!1;var t,n=!1,r=this._changing?this._previousAttributes:this.attributes;for(var i in e){if(f.isEqual(r[i],t=e[i]))continue;(n||(n={}))[i]=t}return n},previous:function(e){return e==null||!this._previousAttributes?null:this._previousAttributes[e]},previousAttributes:function(){return f.clone(this._previousAttributes)},fetch:function(e){e=e?f.clone(e):{},e.parse===void 0&&(e.parse=!0);var t=e.success;return e.success=function(e,n,r){if(!e.set(e.parse(n,r),r))return!1;t&&t(e,n,r)},this.sync("read",this,e)},save:function(e,t,n){var r,i,s,o,u=this.attributes;return e==null||typeof e=="object"?(r=e,n=t):(r={})[e]=t,r&&(!n||!n.wait)&&!this.set(r,n)?!1:(n=f.extend({validate:!0},n),this._validate(r,n)?(r&&n.wait&&(this.attributes=f.extend({},u,r)),n.parse===void 0&&(n.parse=!0),i=n.success,n.success=function(e,t,n){e.attributes=u;var s=e.parse(t,n);n.wait&&(s=f.extend(r||{},s));if(f.isObject(s)&&!e.set(s,n))return!1;i&&i(e,t,n)},s=this.isNew()?"create":n.patch?"patch":"update",s==="patch"&&(n.attrs=r),o=this.sync(s,this,n),r&&n.wait&&(this.attributes=u),o):!1)},destroy:function(e){e=e?f.clone(e):{};var t=this,n=e.success,r=function(){t.trigger("destroy",t,t.collection,e)};e.success=function(e,t,i){(i.wait||e.isNew())&&r(),n&&n(e,t,i)};if(this.isNew())return e.success(this,null,e),!1;var i=this.sync("delete",this,e);return e.wait||r(),i},url:function(){var e=f.result(this,"urlRoot")||f.result(this.collection,"url")||D();return this.isNew()?e:e+(e.charAt(e.length-1)==="/"?"":"/")+encodeURIComponent(this.id)},parse:function(e,t){return e},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return this.id==null},isValid:function(e){return!this.validate||!this.validate(this.attributes,e)},_validate:function(e,t){if(!t.validate||!this.validate)return!0;e=f.extend({},this.attributes,e);var n=this.validationError=this.validate(e,t)||null;return n?(this.trigger("invalid",this,n,t||{}),!1):!0}});var v=a.Collection=function(e,t){t||(t={}),t.model&&(this.model=t.model),t.comparator!==void 0&&(this.comparator=t.comparator),this.models=[],this._reset(),this.initialize.apply(this,arguments),e&&this.reset(e,f.extend({silent:!0},t))};f.extend(v.prototype,p,{model:d,initialize:function(){},toJSON:function(e){return this.map(function(t){return t.toJSON(e)})},sync:function(){return a.sync.apply(this,arguments)},add:function(e,t){e=f.isArray(e)?e.slice():[e],t||(t={});var n,r,i,o,a,l,c,h,p,d;c=[],h=t.at,p=this.comparator&&h==null&&t.sort!=0,d=f.isString(this.comparator)?this.comparator:null;for(n=0,r=e.length;n<r;n++){if(!(i=this._prepareModel(o=e[n],t))){this.trigger("invalid",this,o,t);continue}if(a=this.get(i)){t.merge&&(a.set(o===i?i.attributes:o,t),p&&!l&&a.hasChanged(d)&&(l=!0));continue}c.push(i),i.on("all",this._onModelEvent,this),this._byId[i.cid]=i,i.id!=null&&(this._byId[i.id]=i)}c.length&&(p&&(l=!0),this.length+=c.length,h!=null?u.apply(this.models,[h,0].concat(c)):s.apply(this.models,c)),l&&this.sort({silent:!0});if(t.silent)return this;for(n=0,r=c.length;n<r;n++)(i=c[n]).trigger("add",i,this,t);return l&&this.trigger("sort",this,t),this},remove:function(e,t){e=f.isArray(e)?e.slice():[e],t||(t={});var n,r,i,s;for(n=0,r=e.length;n<r;n++){s=this.get(e[n]);if(!s)continue;delete this._byId[s.id],delete this._byId[s.cid],i=this.indexOf(s),this.models.splice(i,1),this.length--,t.silent||(t.index=i,s.trigger("remove",s,this,t)),this._removeReference(s)}return this},push:function(e,t){return e=this._prepareModel(e,t),this.add(e,f.extend({at:this.length},t)),e},pop:function(e){var t=this.at(this.length-1);return this.remove(t,e),t},unshift:function(e,t){return e=this._prepareModel(e,t),this.add(e,f.extend({at:0},t)),e},shift:function(e){var t=this.at(0);return this.remove(t,e),t},slice:function(e,t){return this.models.slice(e,t)},get:function(e){return e==null?void 0:(this._idAttr||(this._idAttr=this.model.prototype.idAttribute),this._byId[e.id||e.cid||e[this._idAttr]||e])},at:function(e){return this.models[e]},where:function(e){return f.isEmpty(e)?[]:this.filter(function(t){for(var n in e)if(e[n]!==t.get(n))return!1;return!0})},sort:function(e){if(!this.comparator)throw new Error("Cannot sort a set without a comparator");return e||(e={}),f.isString(this.comparator)||this.comparator.length===1?this.models=this.sortBy(this.comparator,this):this.models.sort(f.bind(this.comparator,this)),e.silent||this.trigger("sort",this,e),this},pluck:function(e){return f.invoke(this.models,"get",e)},update:function(e,t){t=f.extend({add:!0,merge:!0,remove:!0},t),t.parse&&(e=this.parse(e,t));var n,r,i,s,o=[],u=[],a={};f.isArray(e)||(e=e?[e]:[]);if(t.add&&!t.remove)return this.add(e,t);for(r=0,i=e.length;r<i;r++)n=e[r],s=this.get(n),t.remove&&s&&(a[s.cid]=!0),(t.add&&!s||t.merge&&s)&&o.push(n);if(t.remove)for(r=0,i=this.models.length;r<i;r++)n=this.models[r],a[n.cid]||u.push(n);return u.length&&this.remove(u,t),o.length&&this.add(o,t),this},reset:function(e,t){t||(t={}),t.parse&&(e=this.parse(e,t));for(var n=0,r=this.models.length;n<r;n++)this._removeReference(this.models[n]);return t.previousModels=this.models.slice(),this._reset(),e&&this.add(e,f.extend({silent:!0},t)),t.silent||this.trigger("reset",this,t),this},fetch:function(e){e=e?f.clone(e):{},e.parse===void 0&&(e.parse=!0);var t=e.success;return e.success=function(e,n,r){var i=r.update?"update":"reset";e[i](n,r),t&&t(e,n,r)},this.sync("read",this,e)},create:function(e,t){t=t?f.clone(t):{};if(!(e=this._prepareModel(e,t)))return!1;t.wait||this.add(e,t);var n=this,r=t.success;return t.success=function(e,t,i){i.wait&&n.add(e,i),r&&r(e,t,i)},e.save(null,t),e},parse:function(e,t){return e},clone:function(){return new this.constructor(this.models)},_reset:function(){this.length=0,this.models.length=0,this._byId={}},_prepareModel:function(e,t){if(e instanceof d)return e.collection||(e.collection=this),e;t||(t={}),t.collection=this;var n=new this.model(e,t);return n._validate(e,t)?n:!1},_removeReference:function(e){this===e.collection&&delete e.collection,e.off("all",this._onModelEvent,this)},_onModelEvent:function(e,t,n,r){if((e==="add"||e==="remove")&&n!==this)return;e==="destroy"&&this.remove(t,r),t&&e==="change:"+t.idAttribute&&(delete this._byId[t.previous(t.idAttribute)],t.id!=null&&(this._byId[t.id]=t)),this.trigger.apply(this,arguments)},sortedIndex:function(e,t,n){t||(t=this.comparator);var r=f.isFunction(t)?t:function(e){return e.get(t)};return f.sortedIndex(this.models,e,r,n)}});var m=["forEach","each","map","collect","reduce","foldl","inject","reduceRight","foldr","find","detect","filter","select","reject","every","all","some","any","include","contains","invoke","max","min","toArray","size","first","head","take","initial","rest","tail","drop","last","without","indexOf","shuffle","lastIndexOf","isEmpty","chain"];f.each(m,function(e){v.prototype[e]=function(){var t=o.call(arguments);return t.unshift(this.models),f[e].apply(f,t)}});var g=["groupBy","countBy","sortBy"];f.each(g,function(e){v.prototype[e]=function(t,n){var r=f.isFunction(t)?t:function(e){return e.get(t)};return f[e](this.models,r,n)}});var y=a.Router=function(e){e||(e={}),e.routes&&(this.routes=e.routes),this._bindRoutes(),this.initialize.apply(this,arguments)},b=/\((.*?)\)/g,w=/(\(\?)?:\w+/g,E=/\*\w+/g,S=/[\-{}\[\]+?.,\\\^$|#\s]/g;f.extend(y.prototype,p,{initialize:function(){},route:function(e,t,n){return f.isRegExp(e)||(e=this._routeToRegExp(e)),n||(n=this[t]),a.history.route(e,f.bind(function(r){var i=this._extractParameters(e,r);n&&n.apply(this,i),this.trigger.apply(this,["route:"+t].concat(i)),this.trigger("route",t,i),a.history.trigger("route",this,t,i)},this)),this},navigate:function(e,t){return a.history.navigate(e,t),this},_bindRoutes:function(){if(!this.routes)return;var e,t=f.keys(this.routes);while((e=t.pop())!=null)this.route(e,this.routes[e])},_routeToRegExp:function(e){return e=e.replace(S,"\\$&").replace(b,"(?:$1)?").replace(w,function(e,t){return t?e:"([^/]+)"}).replace(E,"(.*?)"),new RegExp("^"+e+"$")},_extractParameters:function(e,t){return e.exec(t).slice(1)}});var x=a.History=function(){this.handlers=[],f.bindAll(this,"checkUrl"),typeof window!="undefined"&&(this.location=window.location,this.history=window.history)},T=/^[#\/]|\s+$/g,N=/^\/+|\/+$/g,C=/msie [\w.]+/,k=/\/$/;x.started=!1,f.extend(x.prototype,p,{interval:50,getHash:function(e){var t=(e||this).location.href.match(/#(.*)$/);return t?t[1]:""},getFragment:function(e,t){if(e==null)if(this._hasPushState||!this._wantsHashChange||t){e=this.location.pathname;var n=this.root.replace(k,"");e.indexOf(n)||(e=e.substr(n.length))}else e=this.getHash();return e.replace(T,"")},start:function(e){if(x.started)throw new Error("Backbone.history has already been started");x.started=!0,this.options=f.extend({},{root:"/"},this.options,e),this.root=this.options.root,this._wantsHashChange=this.options.hashChange!==!1,this._wantsPushState=!!this.options.pushState,this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var t=this.getFragment(),n=document.documentMode,r=C.exec(navigator.userAgent.toLowerCase())&&(!n||n<=7);this.root=("/"+this.root+"/").replace(N,"/"),r&&this._wantsHashChange&&(this.iframe=a.$('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo("body")[0].contentWindow,this.navigate(t)),this._hasPushState?a.$(window).on("popstate",this.checkUrl):this._wantsHashChange&&"onhashchange"in window&&!r?a.$(window).on("hashchange",this.checkUrl):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval)),this.fragment=t;var i=this.location,s=i.pathname.replace(/[^\/]$/,"$&/")===this.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!s)return this.fragment=this.getFragment(null,!0),this.location.replace(this.root+this.location.search+"#"+this.fragment),!0;this._wantsPushState&&this._hasPushState&&s&&i.hash&&(this.fragment=this.getHash().replace(T,""),this.history.replaceState({},document.title,this.root+this.fragment+i.search));if(!this.options.silent)return this.loadUrl()},stop:function(){a.$(window).off("popstate",this.checkUrl).off("hashchange",this.checkUrl),clearInterval(this._checkUrlInterval),x.started=!1},route:function(e,t){this.handlers.unshift({route:e,callback:t})},checkUrl:function(e){var t=this.getFragment();t===this.fragment&&this.iframe&&(t=this.getFragment(this.getHash(this.iframe)));if(t===this.fragment)return!1;this.iframe&&this.navigate(t),this.loadUrl()||this.loadUrl(this.getHash())},loadUrl:function(e){var t=this.fragment=this.getFragment(e),n=f.any(this.handlers,function(e){if(e.route.test(t))return e.callback(t),!0});return n},navigate:function(e,t){if(!x.started)return!1;if(!t||t===!0)t={trigger:t};e=this.getFragment(e||"");if(this.fragment===e)return;this.fragment=e;var n=this.root+e;if(this._hasPushState)this.history[t.replace?"replaceState":"pushState"]({},document.title,n);else{if(!this._wantsHashChange)return this.location.assign(n);this._updateHash(this.location,e,t.replace),this.iframe&&e!==this.getFragment(this.getHash(this.iframe))&&(t.replace||this.iframe.document.open().close(),this._updateHash(this.iframe.location,e,t.replace))}t.trigger&&this.loadUrl(e)},_updateHash:function(e,t,n){if(n){var r=e.href.replace(/(javascript:|#).*$/,"");e.replace(r+"#"+t)}else e.hash="#"+t}}),a.history=new x;var L=a.View=function(e){this.cid=f.uniqueId("view"),this._configure(e||{}),this._ensureElement(),this.initialize.apply(this,arguments),this.delegateEvents()},A=/^(\S+)\s*(.*)$/,O=["model","collection","el","id","attributes","className","tagName","events"];f.extend(L.prototype,p,{tagName:"div",$:function(e){return this.$el.find(e)},initialize:function(){},render:function(){return this},remove:function(){return this.$el.remove(),this.stopListening(),this},setElement:function(e,t){return this.$el&&this.undelegateEvents(),this.$el=e instanceof a.$?e:a.$(e),this.el=this.$el[0],t!==!1&&this.delegateEvents(),this},delegateEvents:function(e){if(!e&&!(e=f.result(this,"events")))return;this.undelegateEvents();for(var t in e){var n=e[t];f.isFunction(n)||(n=this[e[t]]);if(!n)throw new Error('Method "'+e[t]+'" does not exist');var r=t.match(A),i=r[1],s=r[2];n=f.bind(n,this),i+=".delegateEvents"+this.cid,s===""?this.$el.on(i,n):this.$el.on(i,s,n)}},undelegateEvents:function(){this.$el.off(".delegateEvents"+this.cid)},_configure:function(e){this.options&&(e=f.extend({},f.result(this,"options"),e)),f.extend(this,f.pick(e,O)),this.options=e},_ensureElement:function(){if(!this.el){var e=f.extend({},f.result(this,"attributes"));this.id&&(e.id=f.result(this,"id")),this.className&&(e["class"]=f.result(this,"className"));var t=a.$("<"+f.result(this,"tagName")+">").attr(e);this.setElement(t,!1)}else this.setElement(f.result(this,"el"),!1)}});var M={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};a.sync=function(e,t,n){var r=M[e];f.defaults(n||(n={}),{emulateHTTP:a.emulateHTTP,emulateJSON:a.emulateJSON});var i={type:r,dataType:"json"};n.url||(i.url=f.result(t,"url")||D()),n.data==null&&t&&(e==="create"||e==="update"||e==="patch")&&(i.contentType="application/json",i.data=JSON.stringify(n.attrs||t.toJSON(n))),n.emulateJSON&&(i.contentType="application/x-www-form-urlencoded",i.data=i.data?{model:i.data}:{});if(n.emulateHTTP&&(r==="PUT"||r==="DELETE"||r==="PATCH")){i.type="POST",n.emulateJSON&&(i.data._method=r);var s=n.beforeSend;n.beforeSend=function(e){e.setRequestHeader("X-HTTP-Method-Override",r);if(s)return s.apply(this,arguments)}}i.type!=="GET"&&!n.emulateJSON&&(i.processData=!1);var o=n.success;n.success=function(e){o&&o(t,e,n),t.trigger("sync",t,e,n)};var u=n.error;n.error=function(e){u&&u(t,e,n),t.trigger("error",t,e,n)};var l=n.xhr=a.ajax(f.extend(i,n));return t.trigger("request",t,l,n),l},a.ajax=function(){return a.$.ajax.apply(a.$,arguments)};var _=function(e,t){var n=this,r;e&&f.has(e,"constructor")?r=e.constructor:r=function(){return n.apply(this,arguments)},f.extend(r,n,t);var i=function(){this.constructor=r};return i.prototype=n.prototype,r.prototype=new i,e&&f.extend(r.prototype,e),r.__super__=n.prototype,r};d.extend=v.extend=y.extend=L.extend=x.extend=_;var D=function(){throw new Error('A "url" property or function must be specified')}}).call(this)}),e.define("/src/js/util/constants.js",function(e,t,n,r,i,s,o){var u={betweenCommandsDelay:400},a={isAnimating:!1},f={minZoom:.55,maxZoom:1.25,minWidth:600,minHeight:600},l={arrowHeadSize:8,nodeRadius:17,curveControlPointOffset:50,defaultEasing:"easeInOut",defaultAnimationTime:400,rectFill:"hsb(0.8816909813322127,0.7,1)",headRectFill:"#2831FF",rectStroke:"#FFF",rectStrokeWidth:"3",multiBranchY:20,upstreamHeadOpacity:.5,upstreamNoneOpacity:.2,edgeUpstreamHeadOpacity:.4,edgeUpstreamNoneOpacity:.15,visBranchStrokeWidth:2,visBranchStrokeColorNone:"#333",defaultNodeFill:"hsba(0.5,0.8,0.7,1)",defaultNodeStrokeWidth:2,defaultNodeStroke:"#FFF",orphanNodeFill:"hsb(0.5,0.8,0.7)"};n.GLOBAL=a,n.TIME=u,n.GRAPHICS=l,n.VIEWPORT=f}),e.define("/src/js/util/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util/constants");n.parseQueryString=function(e){var t={};return e.replace(new RegExp("([^?=&]+)(=([^&]*))?","g"),function(e,n,r,i){t[n]=i}),t},n.isBrowser=function(){var e=String(typeof window)!=="undefined";return e},n.splitTextCommand=function(e,t,n){t=u.bind(t,n),u.each(e.split(";"),function(e,n){e=u.escape(e),e=e.replace(/^(\s+)/,"").replace(/(\s+)$/,"").replace(/&quot;/g,'"').replace(/&#x27;/g,"'");if(n>0&&!e.length)return;t(e)})},n.genParseCommand=function(e,t){return function(n){var r,i;return u.each(e,function(e,t){var s=e.exec(n);s&&(r=t,i=s)}),r?{toSet:{eventName:t,method:r,regexResults:i}}:!1}}}),e.define("/src/js/level/sandbox.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../intl"),h=e("../app"),p=e("../util/errors"),d=e("../visuals/visualization").Visualization,v=e("../level/parseWaterfall").ParseWaterfall,m=e("../level/disabledMap").DisabledMap,g=e("../models/commandModel").Command,y=e("../git/gitShim").GitShim,b=e("../views"),w=b.ModalTerminal,E=b.ModalAlert,S=e("../views/builderViews"),x=e("../views/multiView").MultiView,T=f.View.extend({tagName:"div",initialize:function(e){e=e||{},this.options=e,this.initVisualization(e),this.initCommandCollection(e),this.initParseWaterfall(e),this.initGitShim(e),this.initUndoStack(e),e.wait||this.takeControl()},getDefaultVisEl:function(){return $("#mainVisSpace")[0]},getAnimationTime:function(){return 1050},initVisualization:function(e){this.mainVis=new d({el:e.el||this.getDefaultVisEl()})},initUndoStack:function(e){this.undoStack=[]},initCommandCollection:function(e){this.commandCollection=h.getCommandUI().commandCollection},initParseWaterfall:function(e){this.parseWaterfall=new v},initGitShim:function(e){this.gitShim=new y({beforeCB:u.bind(this.beforeCommandCB,this)})},takeControl:function(){h.getEventBaton().stealBaton("commandSubmitted",this.commandSubmitted,this),h.getEventBaton().stealBaton("processSandboxCommand",this.processSandboxCommand,this),h.getEventBaton().stealBaton("levelExited",this.levelExited,this),this.insertGitShim()},releaseControl:function(){h.getEventBaton().releaseBaton("commandSubmitted",this.commandSubmitted,this),h.getEventBaton().releaseBaton("processSandboxCommand",this.processSandboxCommand,this),h.getEventBaton().releaseBaton("levelExited",this.levelExited,this),this.releaseGitShim()},releaseGitShim:function(){this.gitShim&&this.gitShim.removeShim()},insertGitShim:function(){this.gitShim&&this.mainVis.customEvents.on("gitEngineReady",function(){this.gitShim.insertShim()},this)},beforeCommandCB:function(e){this.pushUndo()},pushUndo:function(){this.undoStack.push(this.mainVis.gitEngine.printTree())},undo:function(e,t){var n=this.undoStack.pop();if(!n){e.set("error",new p.GitError({msg:c.str("undo-stack-empty")})),t.resolve();return}this.mainVis.reset(n),setTimeout(function(){e.finishWith(t)},this.mainVis.getAnimationTime())},commandSubmitted:function(e){h.getEvents().trigger("commandSubmittedPassive",e),l.splitTextCommand(e,function(e){this.commandCollection.add(new g({rawStr:e,parseWaterfall:this.parseWaterfall}))},this)},startLevel:function(t,n){var r=t.get("regexResults")||[],i=r[1]||"",s=h.getLevelArbiter().getLevel(i);if(!s){t.addWarning(c.str("level-no-id",{id:i})),h.getEventBaton().trigger("commandSubmitted","levels"),t.set("status","error"),n.resolve();return}this.hide(),this.clear();var o=a.defer(),u=e("../level").Level;this.currentLevel=new u({level:s,deferred:o,command:t}),o.promise.then(function(){t.finishWith(n)})},buildLevel:function(t,n){this.hide(),this.clear();var r=a.defer(),i=e("../level/builder").LevelBuilder;this.levelBuilder=new i({deferred:r}),r.promise.then(function(){t.finishWith(n)})},exitLevel:function(e,t){e.addWarning(c.str("level-cant-exit")),e.set("status","error"),t.resolve()},showLevels:function(e,t){var n=a.defer();h.getLevelDropdown().show(n,e),n.promise.done(function(){e.finishWith(t)})},resetSolved:function(e,t){h.getLevelArbiter().resetSolvedMap(),e.addWarning(c.str("solved-map-reset")),e.finishWith(t)},processSandboxCommand:function(e,t){var n={"reset solved":this.resetSolved,undo:this.undo,"help general":this.helpDialog,help:this.helpDialog,reset:this.reset,delay:this.delay,clear:this.clear,"exit level":this.exitLevel,level:this.startLevel,sandbox:this.exitLevel,levels:this.showLevels,mobileAlert:this.mobileAlert,"build level":this.buildLevel,"export tree":this.exportTree,"import tree":this.importTree,"import level":this.importLevel},r=n[e.get("method")];if(!r)throw new Error("no method for that wut");r.apply(this,[e,t])},hide:function(){this.mainVis.hide()},levelExited:function(){this.show()},show:function(){this.mainVis.show()},importTree:function(e,t){var n=new S.MarkdownPresenter({previewText:c.str("paste-json"),fillerText:" "});n.deferred.promise.then(u.bind(function(e){try{this.mainVis.gitEngine.loadTree(JSON.parse(e))}catch(t){this.mainVis.reset(),new x({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that JSON! Here is the error:","",String(t)]}}]})}},this)).fail(function(){}).done(function(){e.finishWith(t)})},importLevel:function(t,n){var r=new S.MarkdownPresenter({previewText:c.str("paste-json"),fillerText:" "});r.deferred.promise.then(u.bind(function(r){var i=e("../level").Level;try{var s=JSON.parse(r),o=a.defer();this.currentLevel=new i({level:s,deferred:o,command:t}),this.hide(),o.promise.then(function(){t.finishWith(n)})}catch(u){new x({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that level JSON, this happened:","",String(u)]}}]}),t.finishWith(n)}},this)).fail(function(){t.finishWith(n)}).done()},exportTree:function(e,t){var n=JSON.stringify(this.mainVis.gitEngine.exportTree(),null,2),r=new x({childViews:[{type:"MarkdownPresenter",options:{previewText:c.str("share-tree"),fillerText:n,noConfirmCancel:!0}}]});r.getPromise().then(function(){e.finishWith(t)}).done()},clear:function(e,t){h.getEvents().trigger("clearOldCommands"),e&&t&&e.finishWith(t)},mobileAlert:function(e,t){alert(c.str("mobile-alert")),e.finishWith(t)},delay:function(e,t){var n=parseInt(e.get("regexResults")[1],10);setTimeout(function(){e.finishWith(t)},n)},reset:function(e,t){this.mainVis.reset(),this.initUndoStack(),setTimeout(function(){e.finishWith(t)},this.mainVis.getAnimationTime())},helpDialog:function(t,n){var r=new x({childViews:c.getDialog(e("../dialogs/sandbox"))});r.getPromise().then(u.bind(function(){t.finishWith(n)},this)).done()}});n.Sandbox=T}),e.define("/node_modules/q/package.json",function(e,t,n,r,i,s,o){t.exports={main:"q.js"}}),e.define("/node_modules/q/q.js",function(e,t,n,r,i,s,o){(function(e){if(typeof bootstrap=="function")bootstrap("promise",e);else if(typeof n=="object")e(void 0,n);else if(typeof define=="function")define(e);else if(typeof ses!="undefined"){if(!ses.ok())return;ses.makeQ=function(){var t={};return e(void 0,t)}}else e(void 0,Q={})})(function(e,t){"use strict";function w(e){return b(e)==="[object StopIteration]"||e instanceof E}function x(e,t){t.stack&&typeof e=="object"&&e!==null&&e.stack&&e.stack.indexOf(S)===-1&&(e.stack=T(e.stack)+"\n"+S+"\n"+T(t.stack))}function T(e){var t=e.split("\n"),n=[];for(var r=0;r<t.length;++r){var i=t[r];!C(i)&&!N(i)&&n.push(i)}return n.join("\n")}function N(e){return e.indexOf("(module.js:")!==-1||e.indexOf("(node.js:")!==-1}function C(e){var t=/at .+ \((.*):(\d+):\d+\)/.exec(e);if(!t)return!1;var i=t[1],s=t[2];return i===r&&s>=n&&s<=Ct}function k(){if(Error.captureStackTrace){var e,t,n=Error.prepareStackTrace;return Error.prepareStackTrace=function(n,r){e=r[1].getFileName(),t=r[1].getLineNumber()},(new Error).stack,Error.prepareStackTrace=n,r=e,t}}function L(e,t,n){return function(){return typeof console!="undefined"&&typeof console.warn=="function"&&console.warn(t+" is deprecated, use "+n+" instead.",(new Error("")).stack),e.apply(e,arguments)}}function A(){function s(r){if(!e)return;n=z(r),d(e,function(e,t){u(function(){n.promiseSend.apply(n,t)})},void 0),e=void 0,t=void 0}var e=[],t=[],n,r=g(A.prototype),i=g(M.prototype);return i.promiseSend=function(r,i,s,o){var a=p(arguments);e?(e.push(a),r==="when"&&o&&t.push(o)):u(function(){n.promiseSend.apply(n,a)})},i.valueOf=function(){return e?i:n.valueOf()},Error.captureStackTrace&&(Error.captureStackTrace(i,A),i.stack=i.stack.substring(i.stack.indexOf("\n")+1)),o(i),r.promise=i,r.resolve=s,r.reject=function(e){s(U(e))},r.notify=function(n){e&&d(t,function(e,t){u(function(){t(n)})},void 0)},r}function O(e){var t=A();return ot(e,t.resolve,t.reject,t.notify).fail(t.reject),t.promise}function M(e,t,n,r){t===void 0&&(t=function(e){return U(new Error("Promise does not support operation: "+e))});var i=g(M.prototype);return i.promiseSend=function(n,r){var s=p(arguments,2),o;try{e[n]?o=e[n].apply(i,s):o=t.apply(i,[n].concat(s))}catch(u){o=U(u)}r&&r(o)},n&&(i.valueOf=n),r&&(i.exception=r),o(i),i}function _(e){return D(e)?e.valueOf():e}function D(e){return e&&typeof e.promiseSend=="function"}function P(e){return e&&typeof e.then=="function"}function H(e){return B(e)||j(e)}function B(e){return!P(_(e))}function j(e){return e=_(e),D(e)&&"exception"in e}function R(){!q&&typeof window!="undefined"&&!window.Touch&&window.console&&console.log("Should be empty:",I),q=!0}function U(e){var t=M({when:function(t){if(t){var n=v(F,this);n!==-1&&(I.splice(n,1),F.splice(n,1))}return t?t(e):U(e)}},function(){return U(e)},function n(){return this},e);return R(),F.push(t),I.push(e),t}function z(e){if(D(e))return e;e=_(e);if(P(e)){var t=A();return e.then(t.resolve,t.reject,t.notify),t.promise}return M({when:function(){return e},get:function(t){return e[t]},put:function(t,n){return e[t]=n,e},del:function(t){return delete e[t],e},post:function(t,n){return e[t].apply(e,n)},apply:function(t,n){return e.apply(t,n)},fapply:function(t){return e.apply(void 0,t)},viewInfo:function(){function r(e){n[e]||(n[e]=typeof t[e])}var t=e,n={};while(t)Object.getOwnPropertyNames(t).forEach(r),t=Object.getPrototypeOf(t);return{type:typeof e,properties:n}},keys:function(){return y(e)}},void 0,function n(){return e})}function W(e){return M({isDef:function(){}},function(){var n=p(arguments);return Z.apply(void 0,[e].concat(n))},function(){return _(e)})}function X(e,t){return e=z(e),t?M({viewInfo:function(){return t}},function(){var n=p(arguments);return Z.apply(void 0,[e].concat(n))},function(){return _(e)}):Z(e,"viewInfo")}function V(e){return X(e).when(function(t){var n;t.type==="function"?n=function(){return rt(e,void 0,arguments)}:n={};var r=t.properties||{};return y(r).forEach(function(t){r[t]==="function"&&(n[t]=function(){return nt(e,t,arguments)})}),z(n)})}function $(e,t,n,r){function o(e){try{return typeof t=="function"?t(e):e}catch(n){return U(n)}}function a(e){if(typeof n=="function"){x(e,l);try{return n(e)}catch(t){return U(t)}}return U(e)}function f(e){return typeof r=="function"?r(e):e}var i=A(),s=!1,l=z(e);return u(function(){l.promiseSend("when",function(e){if(s)return;s=!0,i.resolve(o(e))},function(e){if(s)return;s=!0,i.resolve(a(e))})}),l.promiseSend("when",void 0,void 0,function(e){i.notify(f(e))}),i.promise}function J(e,t,n){return $(e,function(e){return ft(e).then(function(e){return t.apply(void 0,e)},n)},n)}function K(e){return function(){function t(e,t){var s;try{s=n[e](t)}catch(o){return w(o)?o.value:U(o)}return $(s,r,i)}var n=e.apply(this,arguments),r=t.bind(t,"send"),i=t.bind(t,"throw");return r()}}function Q(e){throw new E(e)}function G(e){return function(){return ft([this,ft(arguments)]).spread(function(t,n){return e.apply(t,n)})}}function Y(e){return function(t){var n=p(arguments,1);return Z.apply(void 0,[t,e].concat(n))}}function Z(e,t){var n=A(),r=p(arguments,2);return e=z(e),u(function(){e.promiseSend.apply(e,[t,n.resolve].concat(r))}),n.promise}function et(e,t,n){var r=A();return e=z(e),u(function(){e.promiseSend.apply(e,[t,r.resolve].concat(n))}),r.promise}function tt(e){return function(t){var n=p(arguments,1);return et(t,e,n)}}function st(e,t){var n=p(arguments,2);return rt(e,t,n)}function ot(e){var t=p(arguments,1);return it(e,t)}function ut(e,t){var n=p(arguments,2);return function(){var i=n.concat(p(arguments));return rt(e,t,i)}}function at(e){var t=p(arguments,1);return function(){var r=t.concat(p(arguments));return it(e,r)}}function ft(e){return $(e,function(e){var t=e.length;if(t===0)return z(e);var n=A();return d(e,function(r,i,s){B(i)?(e[s]=_(i),--t===0&&n.resolve(e)):$(i,function(r){e[s]=r,--t===0&&n.resolve(e)}).fail(n.reject)},void 0),n.promise})}function lt(e){return $(e,function(e){return $(ft(m(e,function(e){return $(e,i,i)})),function(){return m(e,z)})})}function ct(e,t){return $(e,void 0,t)}function ht(e,t){return $(e,void 0,void 0,t)}function pt(e,t){return $(e,function(e){return $(t(),function(){return e})},function(e){return $(t(),function(){return U(e)})})}function dt(e,n,r,i){function s(n){u(function(){x(n,e);if(!t.onerror)throw n;t.onerror(n)})}var o=n||r||i?$(e,n,r,i):e;ct(o,s)}function vt(e,t){var n=A(),r=setTimeout(function(){n.reject(new Error("Timed out after "+t+" ms"))},t);return $(e,function(e){clearTimeout(r),n.resolve(e)},function(e){clearTimeout(r),n.reject(e)}),n.promise}function mt(e,t){t===void 0&&(t=e,e=void 0);var n=A();return setTimeout(function(){n.resolve(e)},t),n.promise}function gt(e,t){var n=p(t),r=A();return n.push(r.makeNodeResolver()),it(e,n).fail(r.reject),r.promise}function yt(e){var t=p(arguments,1),n=A();return t.push(n.makeNodeResolver()),it(e,t).fail(n.reject),n.promise}function bt(e){var t=p(arguments,1);return function(){var n=t.concat(p(arguments)),r=A();return n.push(r.makeNodeResolver()),it(e,n).fail(r.reject),r.promise}}function wt(e,t,n){return St(e,t).apply(void 0,n)}function Et(e,t){var n=p(arguments,2);return wt(e,t,n)}function St(e){if(arguments.length>1){var t=arguments[1],n=p(arguments,2),r=e;e=function(){var e=n.concat(p(arguments));return r.apply(t,e)}}return function(){var t=A(),n=p(arguments);return n.push(t.makeNodeResolver()),it(e,n).fail(t.reject),t.promise}}function xt(e,t,n){var r=p(n),i=A();return r.push(i.makeNodeResolver()),nt(e,t,r).fail(i.reject),i.promise}function Tt(e,t){var n=p(arguments,2),r=A();return n.push(r.makeNodeResolver()),nt(e,t,n).fail(r.reject),r.promise}function Nt(e,t){if(!t)return e;e.then(function(e){u(function(){t(null,e)})},function(e){u(function(){t(e)})})}var n=k(),r,i=function(){},o=Object.freeze||i;typeof cajaVM!="undefined"&&(o=cajaVM.def);var u;if(typeof s!="undefined")u=s.nextTick;else if(typeof setImmediate=="function")u=setImmediate;else if(typeof MessageChannel!="undefined"){var a=new MessageChannel,f={},l=f;a.port1.onmessage=function(){f=f.next;var e=f.task;delete f.task,e()},u=function(e){l=l.next={task:e},a.port2.postMessage(0)}}else u=function(e){setTimeout(e,0)};var c;if(Function.prototype.bind){var h=Function.prototype.bind;c=h.bind(h.call)}else c=function(e){return function(){return e.call.apply(e,arguments)}};var p=c(Array.prototype.slice),d=c(Array.prototype.reduce||function(e,t){var n=0,r=this.length;if(arguments.length===1)do{if(n in this){t=this[n++];break}if(++n>=r)throw new TypeError}while(1);for(;n<r;n++)n in this&&(t=e(t,this[n],n));return t}),v=c(Array.prototype.indexOf||function(e){for(var t=0;t<this.length;t++)if(this[t]===e)return t;return-1}),m=c(Array.prototype.map||function(e,t){var n=this,r=[];return d(n,function(i,s,o){r.push(e.call(t,s,o,n))},void 0),r}),g=Object.create||function(e){function t(){}return t.prototype=e,new t},y=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t},b=Object.prototype.toString,E;typeof ReturnValue!="undefined"?E=ReturnValue:E=function(e){this.value=e};var S="From previous event:";t.nextTick=u,t.defer=A,A.prototype.makeNodeResolver=function(){var e=this;return function(t,n){t?e.reject(t):arguments.length>2?e.resolve(p(arguments,1)):e.resolve(n)}},A.prototype.node=L(A.prototype.makeNodeResolver,"node","makeNodeResolver"),t.promise=O,t.makePromise=M,M.prototype.then=function(e,t,n){return $(this,e,t,n)},M.prototype.thenResolve=function(e){return $(this,function(){return e})},d(["isResolved","isFulfilled","isRejected","when","spread","send","get","put","del","post","invoke","keys","apply","call","bind","fapply","fcall","fbind","all","allResolved","view","viewInfo","timeout","delay","catch","finally","fail","fin","progress","end","done","nfcall","nfapply","nfbind","ncall","napply","nbind","npost","ninvoke","nend","nodeify"],function(e,n){M.prototype[n]=function(){return t[n].apply(t,[this].concat(p(arguments)))}},void 0),M.prototype.toSource=function(){return this.toString()},M.prototype.toString=function(){return"[object Promise]"},o(M.prototype),t.nearer=_,t.isPromise=D,t.isPromiseAlike=P,t.isResolved=H,t.isFulfilled=B,t.isRejected=j;var F=[],I=[],q;t.reject=U,t.begin=z,t.resolve=z,t.ref=L(z,"ref","resolve"),t.master=W,t.viewInfo=X,t.view=V,t.when=$,t.spread=J,t.async=K,t["return"]=Q,t.promised=G,t.sender=L(Y,"sender","dispatcher"),t.Method=L(Y,"Method","dispatcher"),t.send=L(Z,"send","dispatch"),t.dispatch=et,t.dispatcher=tt,t.get=tt("get"),t.put=tt("put"),t["delete"]=t.del=tt("del");var nt=t.post=tt("post");t.invoke=function(e,t){var n=p(arguments,2);return nt(e,t,n)};var rt=t.apply=L(tt("apply"),"apply","fapply"),it=t.fapply=tt("fapply");t.call=L(st,"call","fcall"),t["try"]=ot,t.fcall=ot,t.bind=L(ut,"bind","fbind"),t.fbind=at,t.keys=tt("keys"),t.all=ft,t.allResolved=lt,t["catch"]=t.fail=ct,t.progress=ht,t["finally"]=t.fin=pt,t.end=L(dt,"end","done"),t.done=dt,t.timeout=vt,t.delay=mt,t.nfapply=gt,t.nfcall=yt,t.nfbind=bt,t.napply=L(wt,"napply","npost"),t.ncall=L(Et,"ncall","ninvoke"),t.nbind=L(St,"nbind","nfbind"),t.npost=xt,t.ninvoke=Tt,t.nend=L(Nt,"nend","nodeify"),t.nodeify=Nt;var Ct=k()})}),e.define("/src/js/intl/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util/constants"),f=e("../util"),l=e("../intl/strings").strings,c=n.getDefaultLocale=function(){return"en_US"},h=n.getLocale=function(){return a.GLOBAL.locale?a.GLOBAL.locale:c()},p=u.clone(u.templateSettings);p.interpolate=/\{(.+?)\}/g;var d=n.template=function(e,t){return u.template(e,t,p)},v=n.str=function(e,t){t=t||{};var n=h();return l[e]?l[e][n]?d(l[e][n],t):e!=="error-untranslated"?v("error-untranslated"):'No translation for the key "'+e+'"':(console.warn("NO INTL support for key "+e),"NO INTL support for key "+e)},m=n.getIntlKey=function(e,t){if(!e||!e[t])throw new Error("that key "+t+"doesnt exist in this blob"+e);return e[t][c()]||console.warn("WARNING!! This blob does not have intl support:",e,"for this key",t),e[t][h()]},g=n.getDialog=function(e){var t=c();return m(e,"dialog")||e.dialog[t]},y=n.getHint=function(e){return m(e,"hint")||v("error-untranslated")},b=n.getName=function(e){return m(e,"name")||v("error-untranslated")},w=n.getStartDialog=function(e){var t=m(e,"startDialog");if(t)return t;var n={type:"ModalAlert",options:{markdown:v("error-untranslated")}},r=u.clone(e.startDialog[f.getDefaultLocale()]||e.startDialog);return r.childViews.unshift(n),r}}),e.define("/src/js/intl/strings.js",function(e,t,n,r,i,s,o){n.strings={"finish-dialog-finished":{__desc__:"One of the lines in the next level dialog",en_US:"Wow! You finished the last level, great!",zh_CN:"我的个天!你完成了最后一关,碉堡了!"},"finish-dialog-next":{__desc__:"One of the lines in the next level dialog",en_US:'Would you like to move on to *"{nextLevel}"*, the next level?',zh_CN:"要不前进到下一关 *“{nextLevel}”*"},"finish-dialog-win":{__desc__:"One of the lines in the next level dialog",en_US:"Awesome! You matched or exceeded our solution.",zh_CN:"牛鼻啊!你达到或者完爆了我们的答案。"},"finish-dialog-lose":{__desc__:"When the user entered more commands than our best, encourage them to do better",en_US:"See if you can whittle it down to {best} :D",zh_CN:"试试看你能否在 {best} 之内搞定 :D"},"git-status-detached":{__desc__:"One of the lines for git status output",en_US:"Detached head!",zh_CN:"脑袋搬家Detached head"},"git-status-onbranch":{__desc__:"One of the lines for git status output",en_US:"On branch {branch}",zh_CN:"切换到分支 {branch}"},"git-status-readytocommit":{__desc__:"One of the lines for git status output",en_US:"Ready to commit! (as always in this demo)",zh_CN:"可以提交啦!(这演示里一直可以提交)"},"git-dummy-msg":{__desc__:"The dummy commit message for all commits. Feel free to put in a shoutout to your school / city / whatever!",en_US:"Quick commit. Go Bears!",zh_CN:"快速提交。上啊月熊!"},"git-error-branch":{__desc__:"One of the error messages for git",en_US:"You can't delete the master branch, the branch you are on, or things that aren't branches",zh_CN:"你不能删除主分支master或者你当前所在的分支或者其他不是分支也不知道能不能吃的东西。"},"git-merge-msg":{__desc__:"The commit message for a merge commit",en_US:"Merge {target} into {current}",zh_CN:"合并 {target} 到 {current}"},"git-error-rebase-none":{__desc__:"One of the error messages for git",en_US:"No commits to rebase! Everything is a merge commit or changes already applied",zh_CN:"没有需要 rebase 的提交!都是个合并提交,或者已经 rebase 过了。"},"git-result-nothing":{__desc__:"The message that explains the result of a git command",en_US:"Nothing to do...",zh_CN:"没啥鸟事……"},"git-result-fastforward":{__desc__:"The message that explains the result of a git command",en_US:"Fast forwarding...",zh_CN:"快速前进……"},"git-result-uptodate":{__desc__:"The message that explains the result of a git command",en_US:"Branch already up-to-date",zh_CN:"分支已经是最新啦"},"git-error-exist":{__desc__:"One of the error messages for git",en_US:"The ref {ref} does not exist or is unknown",zh_CN:"索引 {ref} 不存在,或者找不到。"},"git-error-relative-ref":{__desc__:"One of the error messages for git",en_US:"Commit {commit} doesnot have a {match}",zh_CN:"提交 {commit} 并没有 {match}"},"git-warning-detached":{__desc__:"One of the warning messages for git",en_US:"Warning!! Detached HEAD state",zh_CN:"警告脑袋搬家Detached HEAD状态"},"git-warning-add":{__desc__:"One of the warning messages for git",en_US:"No need to add files in this demo",zh_CN:"此演示中不需要添加文件"},"git-error-options":{__desc__:"One of the error messages for git",en_US:"Those options you specified are incompatible or incorrect",zh_CN:"你所指定的参数不兼容或者不准确"},"git-error-already-exists":{__desc__:"One of the error messages for git",en_US:"The commit {commit} already exists in your changes set, aborting!",zh_CN:"提交 {commit} 已经存在于你的改动集里,正在中止!"},"git-error-reset-detached":{__desc__:"One of the error messages for git",en_US:"Can't reset in detached head! Use checkout if you want to move",zh_CN:"不能在分离的 HEAD 里重置!用 checkout 吧"},"git-warning-hard":{__desc__:"One of the warning messages for git",en_US:"The default behavior is a --hard reset, feel free to omit that option!",zh_CN:"默认的行为是 --hard 硬重置,尽管省略掉那个选项吧!"},"git-error-staging":{__desc__:"One of the error messages for git",en_US:"There is no concept of adding / staging files, so that option or command is invalid!",zh_CN:"没有添加、缓存文件的必要,所以改选项或者命令是不合法的。"},"git-revert-msg":{__desc__:"Message for reverting git command",en_US:"Reverting {oldCommit}: {oldMsg}",zh_CN:"撤销 {oldCommit}{oldMsg}"},"git-error-args-many":{__desc__:"One of the error messages for git",en_US:"I expect at most {upper} argument(s) for {what}",zh_CN:"{what} 期望最多 {upper} 个参数"},"git-error-args-few":{__desc__:"One of the error messages for git",en_US:"I expect at least {lower} argument(s) for {what}",zh_CN:"{what} 期望最少 {lower} 个参数"},"git-error-no-general-args":{__desc__:"One of the error messages for git",en_US:"That command accepts no general arguments",zh_CN:"该命令不接收参数"},"copy-tree-string":{__desc__:"The prompt to copy the tree when sharing",en_US:"Copy the tree string below",zh_CN:"拷贝下面的树字符串"},"learn-git-branching":{__desc__:"The title of the app, with spaces",en_US:"Learn Git Branching",ko:"Git 브랜치 배우기",zh_CN:"学习Git分支"},"select-a-level":{__desc__:"The prompt to select a level on the drop down view",en_US:"Select a level",zh_CN:"选择一关"},"branch-name-short":{__desc__:"When branch names get too long, we need to truncate them. This is the warning for that",en_US:'Sorry, we need to keep branch names short for the visuals. Your branch name was truncated to 9 characters, resulting in "{branch}"',zh_CN:'抱歉为了显示的需要我们需要一个短些的分支名称。您使用的将被截断到9个字符即"{branch}"'},"bad-branch-name":{__desc__:"When the user enters a branch name thats not ok",en_US:'That branch name "{branch}" is not allowed!',zh_CN:'不能给分支起这个名字 "{branch}"'},"option-not-supported":{__desc__:"When the user specifies an option that is not supported by our demo",en_US:'The option "{option}" is not supported!',zh_CN:'不支持选项 "{option}"'},"git-usage-command":{__desc__:"The line that shows how to format a git command",en_US:"git <command> [<args>]",zh_CN:"git <命令> [<参数>]"},"git-supported-commands":{__desc__:"In the git help command, the header above the supported commands",en_US:"Supported commands:",zh_CN:"支持的命令有:"},"git-usage":{__desc__:"In the dummy git output, the header before showing all the commands",en_US:"Usage:",zh_CN:"使用:"},"git-version":{__desc__:"The git version dummy output, kind of silly. PCOTTLE is my unix name but feel free to put yours instead",en_US:"Git Version PCOTTLE.1.0",zh_CN:"Git 版本 PCOTTLE.1.0"},"refresh-tree-command":{__desc__:"when the tree is visually refreshed",en_US:"Refreshing tree...",zh_CN:"正在刷新树结构..."},"locale-command":{__desc__:"when the locale is set to something",en_US:"Locale set to {locale}",zh_CN:"语言更改为 {locale}"},"locale-reset-command":{__desc__:"when the locale is reset",en_US:"Locale reset to default, which is {locale}",zh_CN:"语言重置为默认的 {locale}"},"show-command":{__desc__:'command output title from "show"',en_US:"Please use one of the following commands for more info:"},"show-all-commands":{__desc__:'command output title from "show commands"',en_US:"Here is a list of all the commmands available:"},"cd-command":{__desc__:"dummy command output for the command in the key",en_US:'Directory changed to "/directories/dont/matter/in/this/demo"',zh_CN:'目录切换到 "/directories/dont/matter/in/this/demo"'},"ls-command":{__desc__:"Dummy command output for the command in the key",en_US:"DontWorryAboutFilesInThisDemo.txt",zh_CN:"DontWorryAboutFilesInThisDemo.txt (译: 在试验里不用担心文件.txt)"},"mobile-alert":{__desc__:"When someone comes to the site on a mobile device, they can not input commands so this is a nasty alert to tell them",en_US:"Can't bring up the keyboard on mobile / tablet :( try visiting on desktop! :D",zh_CN:"无法在移动设备/平板上调出键盘 :( 请试试桌面版 :D"},"share-tree":{__desc__:"When you export a tree, we want you to share the tree with friends",en_US:'Share this tree with friends! They can load it with "import tree"',zh_CN:'与你的好友分享提交树!他们可以用 "import tree" 加载它'},"paste-json":{__desc__:"When you are importing a level or tree",en_US:"Paste a JSON blob below!",zh_CN:"在下边粘贴一个JSON串"},"solved-map-reset":{__desc__:"When you reset the solved map to clear your solved history, in case someone else wants to use your browser",fr_FR:"La carte des solutions a été effacée, vous repartez de zéro !",en_US:"Solved map was reset, you are starting from a clean slate!",zh_CN:"解决列表已重置,您现在从零开始了"},"level-cant-exit":{__desc__:"When the user tries to exit a level when they are not in one",en_US:'You are not in a level! You are in a sandbox, start a level with "levels"',zh_CN:'您没在关卡中!您在沙盒中,要开始关卡请输入 "levels"'},"level-no-id":{__desc__:"When you say an id but that level doesnt exist",en_US:'A level for that id "{id}" was not found! Opening up a level selection view',zh_CN:'没找到id为 "{id}" 的关卡!打开关卡选择框'},"undo-stack-empty":{__desc__:"The undo command can only undo back until the last time the level was reset or the beginning of the level",en_US:"The undo stack is empty!",zh_CN:"还没有什么可以撤销"},"already-solved":{__desc__:"When you play in a level that is already solved",en_US:'You have already solved this level, try other levels with "levels" or go back to sandbox with "sandbox"',zh_CN:'你已经解决了本关,输入 "levels" 尝试其他关卡,或者输入 "sandbox" 回到沙盒中'},"command-disabled":{__desc__:"When you try a command that is disabled",en_US:"That git command is disabled for this level!",zh_CN:"该命令在本关不允许使用!"},"share-json":{__desc__:"when you have made the level, prompt to share this",en_US:"Here is the JSON for this level! Share it with somenoe or send it to me on Github",zh_CN:"这是一个关卡定义JSON您可以分享它或者发到我的GitHub上"},"want-start-dialog":{__desc__:"prompt to add a start dialog",en_US:"You have not specified a start dialog, would you like to add one?",zh_CN:"您还没有定义一开始的介绍,是否添加一个?"},"want-hint":{__desc__:"prompt to add a hint",en_US:"You have not specified a hint, would you like to add one?",zh_CN:"您还没有定义提示,是否添加一个?"},"prompt-hint":{__desc__:"prompt for hint",en_US:"Enter the hint for this level, or leave this blank if you do not want to include one",zh_CN:"请输入关卡提示,或者故意留空"},"prompt-name":{__desc__:"prompt for level name",en_US:"Enter the name for the level",zh_CN:"输入关卡名"},"solution-empty":{__desc__:"If you define a solution without any commands, aka a level that is solved without doing anything",en_US:"Your solution is empty!! Something is amiss",zh_CN:"你的解法是空的!! 这应该是出错了"},"define-start-warning":{__desc__:"When you define the start point again, it overwrites the solution and goal so we add a warning",en_US:"Defining start point... solution and goal will be overwritten if they were defined earlier",zh_CN:"定义开始点... 解决方法和目标会被新的替代"},"help-vague-level":{__desc__:"When you are in a level and you say help, its vague and you need to specify",en_US:'You are in a level, so multiple forms of help are available. Please select either "help level" or "help general"',zh_CN:'您正在关卡中,这里有多种形式的帮助,请选择 "help level" (关卡帮助)或 "help general" (一般帮助)'},"help-vague-builder":{__desc__:"When you are in a level builder, the help command is vague so you need to specify what you mean",en_US:'You are in a level builder, so multiple forms of help are available. Please select either "help general" or "help builder"',zh_CN:'您正在进行关卡构建中,这里有多种形式的帮助,请选择 "help general" (一般帮助)或 "help builder" (关卡构建帮助)'},"goal-to-reach":{__desc__:"title of window that shoes the goal tree to reach",en_US:"Goal To Reach",zh_CN:"目标"},"hide-goal":{__desc__:"the helper message for the window that shows the goal tree",en_US:'You can hide this window with "hide goal"',zh_CN:'你可以通过命令 "hide goal" 关闭这个窗口'},"hide-start":{__desc__:"The helper message for the window that shows the start tree for a level",en_US:'You can hide this window with "hide start"',zh_CN:'你可以通过命令 "hide start" 关闭这个窗口'},"level-builder":{__desc__:"The name for the environment where you build levels",en_US:"Level Builder",zh_CN:"关卡生成器"},"no-start-dialog":{__desc__:"when the user tries to open a start dialog for a level that does not have one",en_US:"There is no start dialog to show for this level!",zh_CN:"介绍? 这关真没有!"},"no-hint":{__desc__:"when no hint is available for a level",en_US:"Hmm, there doesn't seem to be a hint for this level :-/",zh_CN:"提示?嗯,这关真没有哎~ :-/"},"error-untranslated-key":{__desc__:"This error happens when we are trying to translate a specific key and the locale version is mission",en_US:"The translation for {key} does not exist yet :( Please hop on github and offer up a translation!",zh_CN:"还没翻译 {key} :( 请在gitHub上贡献你的翻译!"},"error-untranslated":{__desc__:"The general error when we encounter a dialog that is not translated",fr_FR:"Ce message n'a pas encore été traduit dans votre langue :( Venez sur Github aider à la traduction !",en_US:"This dialog or text is not yet translated in your locale :( Hop on github to aid in translation!",zh_CN:"这段对话还没有被翻译成你的语言 :( 欢迎在gitHub上贡献你的翻译!"}}}),e.define("/src/js/app/index.js",function(e,t,n,r,i,s,o){function E(){var t=e("../views"),n=e("../models/collections"),r=e("../views/commandViews"),i=new t.MainHelperBar;this.commandCollection=new n.CommandCollection,this.commandBuffer=new n.CommandBuffer({collection:this.commandCollection}),this.commandPromptView=new r.CommandPromptView({el:$("#commandLineBar")}),this.commandLineHistoryView=new r.CommandLineHistoryView({el:$("#commandLineHistory"),collection:this.commandCollection})}var u=e("underscore"),a=e("backbone"),f=e("../util/constants"),l=e("../util"),c=u.clone(a.Events),h,p,d,v,m,g=function(){var t=e("../level/sandbox").Sandbox,n=e("../level").Level,r=e("../util/eventBaton").EventBaton,i=e("../level/arbiter").LevelArbiter,s=e("../views/levelDropdownView").LevelDropdownView;d=new r,h=new E,p=new t,v=new i,m=new s({wait:!0}),c.on("localeChanged",y),b(d),w(p)},y=function(){if(!window.$)return;$("span.intl-aware").each(function(t,n){var r=e("../intl"),i=$(n).attr("data-intl");$(n).text(r.str(i).toUpperCase())})},b=function(e){var t=function(){$("#commandTextField").focus()};t(),$(window).focus(function(t){e.trigger("windowFocus",t)}),$(document).click(function(t){e.trigger("documentClick",t)}),$(document).bind("keydown",function(t){e.trigger("docKeydown",t)}),$(document).bind("keyup",function(t){e.trigger("docKeyup",t)}),$(window).on("resize",function(e){c.trigger("resize",e)}),e.stealBaton("docKeydown",function(){}),e.stealBaton("docKeyup",function(){}),e.stealBaton("windowFocus",t),e.stealBaton("documentClick",t);var n=function(t){return function(){var n=[t];u.each(arguments,function(e){n.push(e)}),e.trigger.apply(e,n)}};$("#commandTextField").on("keydown",n("keydown")),$("#commandTextField").on("keyup",n("keyup")),$(window).trigger("resize")},w=function(e){var t=l.parseQueryString(window.location.href);t.hasOwnProperty("demo")?e.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git commit; git checkout -b bugFix C1; git commit; git merge master; git checkout master; git commit; git rebase bugFix;","delay 1000; reset;","level rebase1 --noFinishDialog --noStartCommand --noIntroDialog;","delay 2000; show goal; delay 1000; hide goal;","git checkout bugFix; git rebase master; git checkout side; git rebase bugFix;","git checkout another; git rebase side; git rebase another master;","help; levels"].join(""))}):t.hasOwnProperty("NODEMO")||e.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git help;","delay 1000;","help;","levels"].join(""))}),t.locale!==undefined&&t.locale.length&&(f.GLOBAL.locale=t.locale,c.trigger("localeChanged"));if(t.command){var n=unescape(t.command);e.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",n)})}(/(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent)||/android/i.test(navigator.userAgent))&&e.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted","mobile alert")})};e("../util").isBrowser()&&$(document).ready(g),n.getEvents=function(){return c},n.getSandbox=function(){return p},n.getEventBaton=function(){return d},n.getCommandUI=function(){return h},n.getLevelArbiter=function(){return v},n.getLevelDropdown=function(){return m},n.init=g}),e.define("/src/js/level/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("q"),l=e("../util"),c=e("../app"),h=e("../intl"),p=e("../util/errors"),d=e("../level/sandbox").Sandbox,v=e("../util/constants"),m=e("../visuals/visualization").Visualization,g=e("../level/parseWaterfall").ParseWaterfall,y=e("../level/disabledMap").DisabledMap,b=e("../models/commandModel").Command,w=e("../git/gitShim").GitShim,E=e("../views/multiView").MultiView,S=e("../views").CanvasTerminalHolder,x=e("../views").ConfirmCancelTerminal,T=e("../views").NextLevelConfirm,N=e("../views").LevelToolbar,C=e("../git/treeCompare").TreeCompare,k={"help level":/^help level$/,"start dialog":/^start dialog$/,"show goal":/^(show goal|goal|help goal)$/,"hide goal":/^hide goal$/,"show solution":/^show solution($|\s)/,objective:/^(objective|assignment)$/},L=l.genParseCommand(k,"processLevelCommand"),A=d.extend({initialize:function(e){e=e||{},e.level=e.level||{},this.level=e.level,this.gitCommandsIssued=[],this.commandsThatCount=this.getCommandsThatCount(),this.solved=!1,this.treeCompare=new C,this.initGoalData(e),this.initName(e),A.__super__.initialize.apply(this,[e]),this.startOffCommand(),this.handleOpen(e.deferred)},handleOpen:function(e){e=e||f.defer();if(this.level.startDialog&&!this.testOption("noIntroDialog")){new E(u.extend({},h.getStartDialog(this.level),{deferred:e}));return}setTimeout(function(){e.resolve()},this.getAnimationTime()*1.2)},objectiveDialog:function(e,t,n){n=n===undefined?this.level:n;if(!n||!n.startDialog){e.set("error",new p.GitError({msg:h.str("no-start-dialog")})),t.resolve();return}var r=u.clone(h.getStartDialog(n));r.childViews=r.childViews.splice(-1),new E(u.extend(r,{deferred:t})),t.promise.then(function(){e.set("status","finished")})},startDialog:function(e,t){if(!this.level.startDialog){e.set("error",new p.GitError({msg:h.str("no-start-dialog")})),t.resolve();return}this.handleOpen(t),t.promise.then(function(){e.set("status","finished")})},initName:function(){var e=h.getName(this.level);this.levelToolbar=new N({name:e})},initGoalData:function(e){if(!this.level.goalTreeString||!this.level.solutionCommand)throw new Error("need goal tree and solution")},takeControl:function(){c.getEventBaton().stealBaton("processLevelCommand",this.processLevelCommand,this),A.__super__.takeControl.apply(this)},releaseControl:function(){c.getEventBaton().releaseBaton("processLevelCommand",this.processLevelCommand,this),A.__super__.releaseControl.apply(this)},startOffCommand:function(){this.testOption("noStartCommand")||c.getEventBaton().trigger("commandSubmitted","hint; delay 2000; show goal")},initVisualization:function(e){this.mainVis=new m({el:e.el||this.getDefaultVisEl(),treeString:e.level.startTree})},initGoalVisualization:function(){return this.goalCanvasHolder=new S,this.goalVis=new m({el:this.goalCanvasHolder.getCanvasLocation(),containerElement:this.goalCanvasHolder.getCanvasLocation(),treeString:this.level.goalTreeString,noKeyboardInput:!0,noClick:!0}),this.goalCanvasHolder},showSolution:function(t,n){var r=this.level.solutionCommand,i=u.bind(function(){this.isShowingSolution=!0,c.getEventBaton().trigger("commandSubmitted",r)},this),s=t.get("rawStr");this.testOptionOnString(s,"noReset")||(r="reset --forSolution; "+r);if(this.testOptionOnString(s,"force")){i(),t.finishWith(n);return}var o=f.defer(),a=h.getDialog(e("../dialogs/confirmShowSolution"))[0],l=new x({markdowns:a.options.markdowns,deferred:o});o.promise.then(i).fail(function(){t.setResult("")}).done(function(){setTimeout(function(){t.finishWith(n)},l.getAnimationTime())})},showGoal:function(e,t){this.showSideVis(e,t,this.goalCanvasHolder,this.initGoalVisualization)},showSideVis:function(e,t,n,r){var i=function(){e&&e.finishWith(t)};if(!n||!n.inDom)n=r.apply(this);n.slideIn(),setTimeout(i,n.getAnimationTime())},hideGoal:function(e,t){this.hideSideVis(e,t,this.goalCanvasHolder)},hideSideVis:function(e,t,n,r){var i=function(){e&&e.finishWith(t)};n&&n.inDom?(n.die(),setTimeout(i,n.getAnimationTime())):i()},initParseWaterfall:function(e){A.__super__.initParseWaterfall.apply(this,[e]),this.parseWaterfall.addFirst("parseWaterfall",L),this.parseWaterfall.addFirst("instantWaterfall",this.getInstantCommands()),e.level.disabledMap&&this.parseWaterfall.addFirst("instantWaterfall",(new y({disabledMap:e.level.disabledMap})).getInstantCommands())},initGitShim:function(e){this.gitShim=new w({beforeCB:u.bind(this.beforeCommandCB,this),afterCB:u.bind(this.afterCommandCB,this),afterDeferHandler:u.bind(this.afterCommandDefer,this)})},getCommandsThatCount:function(){var t=e("../git/commands"),n=["git commit","git checkout","git rebase","git reset","git branch","git revert","git merge","git cherry-pick"],r={};return u.each(n,function(e){if(!t.regexMap[e])throw new Error("wut no regex");r[e]=t.regexMap[e]}),r},undo:function(){this.gitCommandsIssued.pop(),A.__super__.undo.apply(this,arguments)},afterCommandCB:function(e){if(e.get("error"))return;var t=!1;u.each(this.commandsThatCount,function(n){t=t||n.test(e.get("rawStr"))}),t&&this.gitCommandsIssued.push(e.get("rawStr"))},afterCommandDefer:function(e,t){if(this.solved){t.addWarning(h.str("already-solved")),e.resolve();return}var n=this.mainVis.gitEngine.exportTree(),r;this.level.compareOnlyMaster?r=this.treeCompare.compareBranchWithinTrees(n,this.level.goalTreeString,"master"):this.level.compareOnlyBranches?r=this.treeCompare.compareAllBranchesWithinTrees(n,this.level.goalTreeString):this.level.compareAllBranchesHashAgnostic?r=this.treeCompare.compareAllBranchesWithinTreesHashAgnostic(n,this.level.goalTreeString):this.level.compareOnlyMasterHashAgnostic?r=this.treeCompare.compareBranchesWithinTreesHashAgnostic(n,this.level.goalTreeString,["master"]):this.level.compareOnlyMasterHashAgnosticWithAsserts?(r=this.treeCompare.compareBranchesWithinTreesHashAgnostic(n,this.level.goalTreeString,["master"]),r=r&&this.treeCompare.evalAsserts(n,this.level.goalAsserts)):r=this.treeCompare.compareAllBranchesWithinTreesAndHEAD(n,this.level.goalTreeString);if(!r){e.resolve();return}this.levelSolved(e)},getNumSolutionCommands:function(){var e=this.level.solutionCommand.replace(/^;|;$/g,"");return e.split(";").length},testOption:function(e){return this.options.command&&(new RegExp("--"+e)).test(this.options.command.get("rawStr"))},testOptionOnString:function(e,t){return e&&(new RegExp("--"+t)).test(e)},levelSolved:function(e){this.solved=!0,this.isShowingSolution||c.getEvents().trigger("levelSolved",this.level.id),this.hideGoal();var t=c.getLevelArbiter().getNextLevel(this.level.id),n=this.gitCommandsIssued.length,r=this.getNumSolutionCommands();v.GLOBAL.isAnimating=!0;var i=this.testOption("noFinishDialog"),s=this.mainVis.gitVisuals.finishAnimation();i||(s=s.then(function(){var e=new T({nextLevel:t,numCommands:n,best:r});return e.getPromise()})),s.then(function(){!i&&t&&c.getEventBaton().trigger("commandSubmitted","level "+t.id)}).fail(function(){}).done(function(){v.GLOBAL.isAnimating=!1,e.resolve()})},die:function(){this.levelToolbar.die(),this.hideGoal(),this.mainVis.die(),this.releaseControl(),this.clear(),delete this.commandCollection,delete this.mainVis,delete this.goalVis,delete this.goalCanvasHolder},getInstantCommands:function(){var e=u.bind(function(){var e=h.getHint(this.level);return!e||!e.length?h.str("no-hint"):e},this);return[[/^help$|^\?$/,function(){throw new p.CommandResult({msg:h.str("help-vague-level")})}],[/^hint$/,function(){throw new p.CommandResult({msg:e()})}]]},reset:function(e,t){this.gitCommandsIssued=[];var n=e?e.get("rawStr"):"";this.testOptionOnString(n,"forSolution")||(this.isShowingSolution=!1),this.solved=!1,A.__super__.reset.apply(this,arguments)},buildLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().buildLevel(e,t)},this.getAnimationTime()*1.5)},importLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().importLevel(e,t)},this.getAnimationTime()*1.5)},startLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().startLevel(e,t)},this.getAnimationTime()*1.5)},exitLevel:function(e,t){this.die();if(!e||!t)return;setTimeout(function(){e.finishWith(t)},this.getAnimationTime()),c.getEventBaton().trigger("levelExited")},processLevelCommand:function(e,t){var n={"show goal":this.showGoal,"hide goal":this.hideGoal,"show solution":this.showSolution,"start dialog":this.startDialog,"help level":this.startDialog,objective:this.objectiveDialog},r=n[e.get("method")];if(!r)throw new Error("woah we dont support that method yet",r);r.apply(this,[e,t])}});n.Level=A,n.regexMap=k}),e.define("/src/js/util/errors.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({defaults:{type:"MyError",msg:"Unknown Error"},toString:function(){return this.get("type")+": "+this.get("msg")},getMsg:function(){return this.get("msg")||"Unknown Error"},toResult:function(){return this.get("msg").length?"<p>"+this.get("msg").replace(/\n/g,"</p><p>")+"</p>":""}}),l=n.CommandProcessError=f.extend({defaults:{type:"Command Process Error"}}),c=n.CommandResult=f.extend({defaults:{type:"Command Result"}}),h=n.Warning=f.extend({defaults:{type:"Warning"}}),p=n.GitError=f.extend({defaults:{type:"Git Error"}}),d=function(e){if(e instanceof l||e instanceof p||e instanceof c||e instanceof h)return;throw e};n.filterError=d}),e.define("/src/js/visuals/visualization.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections"),l=f.CommitCollection,c=f.BranchCollection,h=e("../util/eventBaton").EventBaton,p=e("../visuals").GitVisuals,d=a.View.extend({initialize:function(e){e=e||{},this.options=e,this.customEvents=u.clone(a.Events),this.containerElement=e.containerElement;var t=this,n=e.containerElement||$("#canvasHolder")[0];new Raphael(n,200,200,function(){var n=this;s.nextTick(function(){t.paperInitialize(n,e)})})},paperInitialize:function(t,n){this.treeString=n.treeString,this.paper=t;var r=e("../app");this.eventBaton=n.noKeyboardInput?new h:r.getEventBaton(),this.commitCollection=new l,this.branchCollection=new c,this.gitVisuals=new p({commitCollection:this.commitCollection,branchCollection:this.branchCollection,paper:this.paper,noClick:this.options.noClick,smallCanvas:this.options.smallCanvas});var i=e("../git").GitEngine;this.gitEngine=new i({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:this.gitVisuals,eventBaton:this.eventBaton}),this.gitEngine.init(),this.gitVisuals.assignGitEngine(this.gitEngine),this.myResize(),$(window).on("resize",u.bind(function(){this.myResize()},this)),this.gitVisuals.drawTreeFirstTime(),this.treeString&&this.gitEngine.loadTreeFromString(this.treeString),this.options.zIndex&&this.setTreeIndex(this.options.zIndex),this.shown=!1,this.setTreeOpacity(0),s.nextTick(u.bind(this.fadeTreeIn,this)),this.customEvents.trigger("gitEngineReady"),this.customEvents.trigger("paperReady")},setTreeIndex:function(e){$(this.paper.canvas).css("z-index",e)},setTreeOpacity:function(e){e===0&&(this.shown=!1),$(this.paper.canvas).css("opacity",e)},getAnimationTime:function(){return 300},fadeTreeIn:function(){this.shown=!0,$(this.paper.canvas).animate({opacity:1},this.getAnimationTime())},fadeTreeOut:function(){this.shown=!1,$(this.paper.canvas).animate({opacity:0},this.getAnimationTime())},hide:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){$(this.paper.canvas).css("visibility","hidden")},this),this.getAnimationTime())},show:function(){$(this.paper.canvas).css("visibility","visible"),setTimeout(u.bind(this.fadeTreeIn,this),10)},showHarsh:function(){$(this.paper.canvas).css("visibility","visible"),this.setTreeOpacity(1)},resetFromThisTreeNow:function(e){this.treeString=e},reset:function(e){var t=e||this.treeString;this.setTreeOpacity(0),this.treeString?this.gitEngine.loadTreeFromString(t):this.gitEngine.defaultInit(),this.fadeTreeIn()},tearDown:function(){this.gitEngine.tearDown(),this.gitVisuals.tearDown(),delete this.paper},die:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){this.shown||this.tearDown()},this),this.getAnimationTime())},myResize:function(){if(!this.paper)return;var e=1,t=this.el,n=t.clientWidth-e,r=t.clientHeight-e;if(!this.containerElement){var i=t.offsetLeft,s=t.offsetTop;$(this.paper.canvas).css({position:"absolute",left:i+"px",top:s+"px"})}this.paper.setSize(n,r),this.gitVisuals.canvasResize(n,r)}});n.Visualization=d}),e.define("/src/js/models/collections.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?f=window.Backbone:f=e("backbone"),l=e("../git").Commit,c=e("../git").Branch,h=e("../models/commandModel").Command,p=e("../models/commandModel").CommandEntry,d=e("../util/constants").TIME,v=f.Collection.extend({model:l}),m=f.Collection.extend({model:h}),g=f.Collection.extend({model:c}),y=f.Collection.extend({model:p,localStorage:f.LocalStorage?new f.LocalStorage("CommandEntries"):null}),b=f.Model.extend({defaults:{collection:null},initialize:function(e){e.collection.bind("add",this.addCommand,this),this.buffer=[],this.timeout=null},addCommand:function(e){this.buffer.push(e),this.touchBuffer()},touchBuffer:function(){if(this.timeout)return;this.setTimeout()},setTimeout:function(){this.timeout=setTimeout(u.bind(function(){this.sipFromBuffer()},this),d.betweenCommandsDelay)},popAndProcess:function(){var e=this.buffer.shift(0);while(e.get("error")&&this.buffer.length)e=this.buffer.shift(0);e.get("error")?this.clear():this.processCommand(e)},processCommand:function(t){t.set("status","processing");var n=a.defer();n.promise.then(u.bind(function(){this.setTimeout()},this));var r=t.get("eventName");if(!r)throw new Error("I need an event to trigger when this guy is parsed and ready");var i=e("../app"),s=i.getEventBaton(),o=s.getNumListeners(r);if(!o){var f=e("../util/errors");t.set("error",new f.GitError({msg:"That command is valid, but not supported in this current environment! Try entering a level or level builder to use that command"})),n.resolve();return}i.getEventBaton().trigger(r,t,n)},clear:function(){clearTimeout(this.timeout),this.timeout=null},sipFromBuffer:function(){if(!this.buffer.length){this.clear();return}this.popAndProcess()}});n.CommitCollection=v,n.CommandCollection=m,n.BranchCollection=g,n.CommandEntryCollection=y,n.CommandBuffer=b}),e.define("/src/js/git/index.js",function(e,t,n,r,i,s,o){function g(e){this.rootCommit=null,this.refs={},this.HEAD=null,this.branchCollection=e.branches,this.commitCollection=e.collection,this.gitVisuals=e.gitVisuals,this.eventBaton=e.eventBaton,this.eventBaton.stealBaton("processGitCommand",this.dispatch,this),this.animationFactory=e.animationFactory||new c.AnimationFactory,this.commandOptions={},this.generalArgs=[],this.initUniqueID()}var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("q"),l=e("../intl"),c=e("../visuals/animation/animationFactory"),h=e("../visuals/animation").AnimationQueue,p=e("./treeCompare").TreeCompare,d=e("../util/errors"),v=d.GitError,m=d.CommandResult;g.prototype.initUniqueID=function(){this.uniqueId=function(){var e=0;return function(t){return t?t+e++:e++}}()},g.prototype.defaultInit=function(){var e=JSON.parse(unescape("%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%2C%22type%22%3A%22branch%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%22C0%22%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C1%22%7D%7D%2C%22HEAD%22%3A%7B%22id%22%3A%22HEAD%22%2C%22target%22%3A%22master%22%2C%22type%22%3A%22general%20ref%22%7D%7D"));this.loadTree(e)},g.prototype.init=function(){this.rootCommit=this.makeCommit(null,null,{rootCommit:!0}),this.commitCollection.add(this.rootCommit);var e=this.makeBranch("master",this.rootCommit);this.HEAD=new y({id:"HEAD",target:e}),this.refs[this.HEAD.get("id")]=this.HEAD,this.commit()},g.prototype.exportTree=function(){var e={branches:{},commits:{},HEAD:null};u.each(this.branchCollection.toJSON(),function(t){t.target=t.target.get("id"),t.visBranch=undefined,e.branches[t.id]=t}),u.each(this.commitCollection.toJSON(),function(t){u.each(w.prototype.constants.circularFields,function(e){t[e]=undefined},this);var n=[];u.each(t.parents,function(e){n.push(e.get("id"))}),t.parents=n,e.commits[t.id]=t},this);var t=this.HEAD.toJSON();return t.visBranch=undefined,t.lastTarget=t.lastLastTarget=t.visBranch=undefined,t.target=t.target.get("id"),e.HEAD=t,e},g.prototype.printTree=function(e){e=e||this.exportTree(),p.prototype.reduceTreeFields([e]);var t=JSON.stringify(e);return/'/.test(t)&&(t=escape(t)),t},g.prototype.printAndCopyTree=function(){window.prompt(l.str("Copy the tree string below"),this.printTree())},g.prototype.loadTree=function(e){e=$.extend(!0,{},e),this.removeAll(),this.instantiateFromTree(e),this.reloadGraphics(),this.initUniqueID()},g.prototype.loadTreeFromString=function(e){this.loadTree(JSON.parse(unescape(e)))},g.prototype.instantiateFromTree=function(e){var t={};u.each(e.commits,function(n){var r=this.getOrMakeRecursive(e,t,n.id);this.commitCollection.add(r)},this),u.each(e.branches,function(n){var r=this.getOrMakeRecursive(e,t,n.id);this.branchCollection.add(r,{silent:!0})},this);var n=this.getOrMakeRecursive(e,t,e.HEAD.id);this.HEAD=n,this.rootCommit=t.C0;if(!this.rootCommit)throw new Error("Need root commit of C0 for calculations");this.refs=t,this.gitVisuals.gitReady=!1,this.branchCollection.each(function(e){this.gitVisuals.addBranch(e)},this)},g.prototype.reloadGraphics=function(){this.gitVisuals.rootCommit=this.refs.C0,this.gitVisuals.initHeadBranch(),this.gitVisuals.drawTreeFromReload(),this.gitVisuals.refreshTreeHarsh()},g.prototype.getOrMakeRecursive=function(e,t,n){if(t[n])return t[n];var r=function(e,t){if(e.commits[t])return"commit";if(e.branches[t])return"branch";if(t=="HEAD")return"HEAD";throw new Error("bad type for "+t)},i=r(e,n);if(i=="HEAD"){var s=e.HEAD,o=new y(u.extend(e.HEAD,{target:this.getOrMakeRecursive(e,t,s.target)}));return t[n]=o,o}if(i=="branch"){var a=e.branches[n],f=new b(u.extend(e.branches[n],{target:this.getOrMakeRecursive(e,t,a.target)}));return t[n]=f,f}if(i=="commit"){var l=e.commits[n],c=[];u.each(l.parents,function(n){c.push(this.getOrMakeRecursive(e,t,n))},this);var h=new w(u.extend(l,{parents:c,gitVisuals:this.gitVisuals}));return t[n]=h,h}throw new Error("ruh rho!! unsupported type for "+n)},g.prototype.tearDown=function(){this.eventBaton.releaseBaton("processGitCommand",this.dispatch,this),this.removeAll()},g.prototype.removeAll=function(){this.branchCollection.reset(),this.commitCollection.reset(),this.refs={},this.HEAD=null,this.rootCommit=null,this.gitVisuals.resetAll()},g.prototype.getDetachedHead=function(){var e=this.HEAD.get("target"),t=e.get("type");return t!=="branch"},g.prototype.validateBranchName=function(e){e=e.replace(/\s/g,"");if(!/^[a-zA-Z0-9]+$/.test(e))throw new v({msg:l.str("bad-branch-name",{branch:e})});if(/[hH][eE][aA][dD]/.test(e))throw new v({msg:l.str("bad-branch-name",{branch:e})});return e.length>9&&(e=e.slice(0,9),this.command.addWarning(l.str("branch-name-short",{branch:e}))),e},g.prototype.makeBranch=function(e,t){e=this.validateBranchName(e);if(this.refs[e])throw new v({msg:l.str("bad-branch-name",{branch:name})});var n=new b({target:t,id:e});return this.branchCollection.add(n),this.refs[n.get("id")]=n,n},g.prototype.getHead=function(){return u.clone(this.HEAD)},g.prototype.getBranches=function(){var e=[];return this.branchCollection.each(function(t){e.push({id:t.get("id"),selected:this.HEAD.get("target")===t,target:t.get("target"),obj:t})},this),e},g.prototype.printBranchesWithout=function(e){var t=this.getUpstreamBranchSet(),n=this.getCommitFromRef(e).get("id"),r=[];u.each(t[n],function(e){e.selected=this.HEAD.get("target").get("id")==e.id,r.push(e)},this),this.printBranches(r)},g.prototype.printBranches=function(e){var t="";throw u.each(e,function(e){t+=(e.selected?"* ":"")+e.id+"\n"}),new m({msg:t})},g.prototype.makeCommit=function(e,t,n){if(!t){t=this.uniqueId("C");while(this.refs[t])t=this.uniqueId("C")}var r=new w(u.extend({parents:e,id:t,gitVisuals:this.gitVisuals},n||{}));return this.refs[r.get("id")]=r,this.commitCollection.add(r),r},g.prototype.acceptNoGeneralArgs=function(){if(this.generalArgs.length)throw new v({msg:l.str("git-error-no-general-args")})},g.prototype.validateArgBounds=function(e,t,n,r){var i=r===undefined?"git "+this.command.get("method"):this.command.get("method")+" "+r+" ";i="with "+i;if(e.length<t)throw new v({msg:l.str("git-error-args-few",{lower:String(t),what:i})});if(e.length>n)throw new v({msg:l.str("git-error-args-many",{upper:String(n),what:i})})},g.prototype.oneArgImpliedHead=function(e,t){this.validateArgBounds(e,0,1,t),e.length===0&&e.push("HEAD")},g.prototype.twoArgsImpliedHead=function(e,t){this.validateArgBounds(e,1,2,t),e.length==1&&e.push("HEAD")},g.prototype.revertStarter=function(){this.validateArgBounds(this.generalArgs,1,NaN);var e=this.revert(this.generalArgs);e&&this.animationFactory.rebaseAnimation(this.animationQueue,e,this,this.gitVisuals)},g.prototype.revert=function(e){var t=[];u.each(e,function(e){t.push(this.getCommitFromRef(e))},this);var n={};n.destinationBranch=this.resolveID(t[0]),n.toRebaseArray=t.slice(0),n.rebaseSteps=[];var r=this.gitVisuals.genSnapshot(),i,s=this.getCommitFromRef("HEAD");return u.each(t,function(e){var t=this.rebaseAltID(e.get("id")),o=l.str("git-revert-msg",{oldCommit:this.resolveName(e),oldMsg:e.get("commitMessage")}),u=this.makeCommit([s],t,{commitMessage:o});s=u,i=this.gitVisuals.genSnapshot(),n.rebaseSteps.push({oldCommit:e,newCommit:u,beforeSnapshot:r,afterSnapshot:i}),r=i},this),this.setTargetLocation("HEAD",s),n},g.prototype.resetStarter=function(){if(this.commandOptions["--soft"])throw new v({msg:l.str("git-error-staging")});this.commandOptions["--hard"]&&(this.command.addWarning(l.str("git-warning-hard")),this.generalArgs=this.generalArgs.concat(this.commandOptions["--hard"])),this.validateArgBounds(this.generalArgs,1,1);if(this.getDetachedHead())throw new v({msg:l.str("git-error-reset-detached")});this.reset(this.generalArgs[0])},g.prototype.reset=function(e){this.setTargetLocation("HEAD",this.getCommitFromRef(e))},g.prototype.cherrypickStarter=function(){this.validateArgBounds(this.generalArgs,1,Number.MAX_VALUE);var e=this.getUpstreamSet("HEAD");u.each(this.generalArgs,function(t){var n=this.getCommitFromRef(t);if(e[n.get("id")])throw new v({msg:l.str("git-error-already-exists",{commit:n.get("id")})})},this);var t={};t.destinationBranch=this.resolveID("HEAD"),t.toRebaseArray=[],t.rebaseSteps=[];var n=this.gitVisuals.genSnapshot(),r,i;u.each(this.generalArgs,function(e){var s=this.getCommitFromRef(e);t.toRebaseArray.push(s),i=this.cherrypick(e),r=this.gitVisuals.genSnapshot(),t.rebaseSteps.push({oldCommit:s,newCommit:i,beforeSnapshot:n,afterSnapshot:this.gitVisuals.genSnapshot()}),n=r},this),this.animationFactory.rebaseAnimation(this.animationQueue,t,this,this.gitVisuals)},g.prototype.cherrypick=function(e){var t=this.getCommitFromRef(e),n=this.rebaseAltID(t.get("id")),r=this.makeCommit([this.getCommitFromRef("HEAD")],n);return this.setTargetLocation(this.HEAD,r),r},g.prototype.commitStarter=function(){this.acceptNoGeneralArgs();if(this.commandOptions["-am"]&&(this.commandOptions["-a"]||this.commandOptions["-m"]))throw new v({msg:l.str("git-error-options")});var e=null,t=null;this.commandOptions["-a"]&&this.command.addWarning(l.str("git-warning-add")),this.commandOptions["-am"]&&(t=this.commandOptions["-am"],this.validateArgBounds(t,1,1,"-am"),e=t[0]),this.commandOptions["-m"]&&(t=this.commandOptions["-m"],this.validateArgBounds(t,1,1,"-m"),e=t[0]);var n=this.commit();e&&(e=e.replace(/&quot;/g,'"').replace(/^"/g,"").replace(/"$/g,""),n.set("commitMessage",e)),this.animationFactory.genCommitBirthAnimation(this.animationQueue,n,this.gitVisuals)},g.prototype.commit=function(){var e=this.getCommitFromRef(this.HEAD),t=null;this.commandOptions["--amend"]&&(e=this.resolveID("HEAD~1"),t=this.rebaseAltID(this.getCommitFromRef("HEAD").get("id")));var n=this.makeCommit([e],t);return this.getDetachedHead()&&this.command.addWarning(l.str("git-warning-detached")),this.setTargetLocation(this.HEAD,n),n},g.prototype.resolveName=function(e){var t=this.resolveID(e);return t.get("type")=="commit"?"commit "+t.get("id"):t.get("type")=="branch"?'branch "'+t.get("id")+'"':this.resolveName(t.get("target"))},g.prototype.resolveID=function(e){if(e===null||e===undefined)throw new Error("Dont call this with null / undefined");return typeof e!="string"?e:this.resolveStringRef(e)},g.prototype.resolveRelativeRef=function(e,t){var n=/([~\^])(\d*)/g,r;while(r=n.exec(t)){var i=e,s=r[2]?parseInt(r[2],10):1;if(r[1]=="^")i=e.getParent(s-1);else while(i&&s--)i=i.getParent(0);if(!i){var o=l.str("git-error-relative-ref",{commit:e.id,match:r[0]});throw new v({msg:o})}e=i}return e},g.prototype.resolveStringRef=function(e){if(this.refs[e])return this.refs[e];if(this.refs[e.toUpperCase()])return this.refs[e.toUpperCase()];var t=null,n=null,r=/^([a-zA-Z0-9]+)(([~\^]\d*)*)/,i=r.exec(e);if(!i)throw new v({msg:l.str("git-error-exist",{ref:e})});t=i[1],n=i[2];if(!this.refs[t])throw new v({msg:l.str("git-error-exist",{ref:e})});var s=this.getCommitFromRef(t);return n&&(s=this.resolveRelativeRef(s,n)),s},g.prototype.getCommitFromRef=function(e){var t=this.resolveID(e);while(t.get("type")!=="commit")t=t.get("target");return t},g.prototype.getType=function(e){return this.resolveID(e).get("type")},g.prototype.setTargetLocation=function(e,t){if(this.getType(e)=="commit")return;e=this.getOneBeforeCommit(e),e.set("target",t)},g.prototype.getUpstreamBranchSet=function(){var e={},t=function(e,t){var n=!1;return u.each(e,function(e){e.id==t&&(n=!0)}),n},n=function(e){var t=[],n=[e];while(n.length){var r=n.pop();t.push(r.get("id")),r.get("parents")&&r.get("parents").length&&(n=n.concat(r.get("parents")))}return t};return this.branchCollection.each(function(r){var i=n(r.get("target"));u.each(i,function(n){e[n]=e[n]||[],t(e[n],r.get("id"))||e[n].push({obj:r,id:r.get("id")})})}),e},g.prototype.getUpstreamHeadSet=function(){var e=this.getUpstreamSet("HEAD"),t=this.getCommitFromRef("HEAD").get("id");return e[t]=!0,e},g.prototype.getOneBeforeCommit=function(e){var t=this.resolveID(e);return t===this.HEAD&&!this.getDetachedHead()&&(t=t.get("target")),t},g.prototype.scrapeBaseID=function(e){var t=/^C(\d+)/.exec(e);if(!t)throw new Error("regex failed on "+e);return"C"+t[1]},g.prototype.rebaseAltID=function(e){var t=[[/^C(\d+)[']{0,2}$/,function(e){return e[0]+"'"}],[/^C(\d+)[']{3}$/,function(e){return e[0].slice(0,-3)+"'^4"}],[/^C(\d+)['][\^](\d+)$/,function(e){return"C"+String(e[1])+"'^"+String(Number(e[2])+1)}]];for(var n=0;n<t.length;n++){var r=t[n][0],i=t[n][1],s=r.exec(e);if(s){var o=i(s);return this.refs[o]?this.rebaseAltID(o):o}}throw new Error("could not modify the id "+e)},g.prototype.idSortFunc=function(e,t){var n=1e3,r=[[/^C(\d+)$/,function(e){return n*e[1]}],[/^C(\d+)([']+)$/,function(e){return n*e[1]+e[2].length}],[/^C(\d+)['][\^](\d+)$/,function(e){return n*e[1]+Number(e[2])}]],i=function(e){for(var t=0;t<r.length;t++){var n=r[t][0],i=r[t][1],s=n.exec(e);if(s)return i(s)}throw new Error("Could not parse commit ID "+e)};return i(e.get("id"))-i(t.get("id"))},g.prototype.dateSortFunc=function(e,t){var n=new Date(e.get("createTime")),r=new Date(t.get("createTime"));return n-r===0?g.prototype.idSortFunc(e,t):n-r},g.prototype.rebaseInteractiveStarter=function(){var e=this.commandOptions["-i"];this.twoArgsImpliedHead(e," -i"),this.rebaseInteractive(e[0],e[1])},g.prototype.rebaseStarter=function(){if(this.commandOptions["-i"]){this.rebaseInteractiveStarter();return}this.twoArgsImpliedHead(this.generalArgs);var e=this.rebase(this.generalArgs[0],this.generalArgs[1]);if(e===undefined)return;this.animationFactory.rebaseAnimation(this.animationQueue,e,this,this.gitVisuals)},g.prototype.rebase=function(e,t){if(this.isUpstreamOf(e,t)){this.command.setResult(l.str("git-result-uptodate")),this.checkout(t);return}if(this.isUpstreamOf(t,e)){this.setTargetLocation(t,this.getCommitFromRef(e)),this.command.setResult(l.str("git-result-fastforward")),this.checkout(t);return}var n=this.getUpstreamSet(e),r=[],i=[this.getCommitFromRef(t)];while(i.length){var s=i.pop();if(n[s.get("id")])continue;r.push(s),r.sort(this.dateSortFunc),i=i.concat(s.get("parents"))}return this.rebaseFinish(r,n,e,t)},g.prototype.rebaseInteractive=function(t,n){if(this.isUpstreamOf(n,t))throw new v({msg:l.str("git-result-nothing")});var r=this.getUpstreamSet(t),i=[],s=[this.getCommitFromRef(n)];while(s.length){var o=s.pop();if(r[o.get("id")])continue;i.push(o),s=s.concat(o.get("parents")),s.sort(this.dateSortFunc)}var a=[];u.each(i,function(e){e.get("parents").length==1&&a.push(e)});if(!a.length)throw new v({msg:l.str("git-error-rebase-none")});this.animationQueue.set("defer",!0);var c=f.defer();c.promise.then(u.bind(function(e){if(!e.length)throw new m({msg:l.str("git-result-nothing")});var r=this.rebaseFinish(e,{},t,n);this.animationFactory.rebaseAnimation(this.animationQueue,r,this,this.gitVisuals),this.animationQueue.start()},this)).fail(u.bind(function(e){this.filterError(e),this.command.set("error",e),this.animationQueue.start()},this)).done();var h=e("../views/rebaseView").InteractiveRebaseView;new h({deferred:c,toRebase:a})},g.prototype.rebaseFinish=function(e,t,n,r){var i={};i.destinationBranch=this.resolveID(n);var s=[];u.each(e,function(e){e.get("parents").length==1&&s.push(e)});var o={};u.each(t,function(e,t){o[this.scrapeBaseID(t)]=e},this),e=s,s=[],u.each(e,function(e){var t=this.scrapeBaseID(e.get("id"));o[t]||s.push(e)},this),e=s,s=[];var a={};u.each(e,function(e){if(a[e.get("id")])return;a[e.get("id")]=!0,s.push(e)},this);if(!s.length)throw new v({msg:l.str("git-error-rebase-none")});i.toRebaseArray=s.slice(0);var f=this.getCommitFromRef(n);i.rebaseSteps=[];var c=this.gitVisuals.genSnapshot(),h;u.each(s,function(e){var t=this.rebaseAltID(e.get("id")),n=this.makeCommit([f],t);f=n,h=this.gitVisuals.genSnapshot(),i.rebaseSteps.push({oldCommit:e,newCommit:n,beforeSnapshot:c,afterSnapshot:h}),c=h},this);if(this.resolveID(r).get("type")=="commit"){var p=i.rebaseSteps,d=p[p.length-1].newCommit;this.checkout(d)}else this.setTargetLocation(r,f),this.checkout(r);return i},g.prototype.mergeStarter=function(){this.validateArgBounds(this.generalArgs,1,1);var e=this.merge(this.generalArgs[0]);if(e===undefined){this.animationFactory.refreshTree(this.animationQueue,this.gitVisuals);return}this.animationFactory.genCommitBirthAnimation(this.animationQueue,e,this.gitVisuals)},g.prototype.merge=function(e){var t="HEAD";if(this.isUpstreamOf(e,t)||this.getCommitFromRef(e)===this.getCommitFromRef(t))throw new m({msg:l.str("git-result-uptodate")});if(this.isUpstreamOf(t,e)){this.setTargetLocation(t,this.getCommitFromRef(e)),this.command.setResult(l.str("git-result-fastforward"));return}var n=this.getCommitFromRef(t),r=this.getCommitFromRef(e),i=l.str("git-merge-msg",{target:this.resolveName(e),current:this.resolveName(t)}),s=this.makeCommit([n,r],null,{commitMessage:i});return this.setTargetLocation(t,s),s},g.prototype.checkoutStarter=function(){var e=null;if(this.commandOptions["-b"]){if(this.generalArgs.length)throw new v({msg:l.str("git-error-options")});e=this.commandOptions["-b"],this.twoArgsImpliedHead(e,"-b");var t=this.validateBranchName(e[0]);this.branch(t,e[1]),this.checkout(t);return}if(this.commandOptions["-"]){var n=this.HEAD.get("lastLastTarget");if(!n)throw new v({msg:l.str("git-result-nothing")});this.HEAD.set("target",n);return}if(this.commandOptions["-B"]){e=this.commandOptions["-B"],this.twoArgsImpliedHead(e,"-B"),this.forceBranch(e[0],e[1]),this.checkout(e[0]);return}this.validateArgBounds(this.generalArgs,1,1),this.checkout(this.unescapeQuotes(this.generalArgs[0]))},g.prototype.checkout=function(e){var t=this.resolveID(e);if(t.get("id")==="HEAD")return;var n=t.get("type");if(n!=="branch"&&n!=="commit")throw new v({msg:l.str("git-error-options")});this.HEAD.set("target",t)},g.prototype.branchStarter=function(){var e=null;if(this.commandOptions["-d"]||this.commandOptions["-D"]){var t=this.commandOptions["-d"]||this.commandOptions["-D"];this.validateArgBounds(t,1,NaN,"-d"),u.each(t,function(e){this.deleteBranch(e)},this);return}if(this.commandOptions["--contains"]){e=this.commandOptions["--contains"],this.validateArgBounds(e,1,1,"--contains"),this.printBranchesWithout(e[0]);return}if(this.commandOptions["-f"]){e=this.commandOptions["-f"],this.twoArgsImpliedHead(e,"-f"),this.forceBranch(e[0],e[1]);return}if(this.generalArgs.length===0){this.printBranches(this.getBranches());return}this.twoArgsImpliedHead(this.generalArgs),this.branch(this.generalArgs[0],this.generalArgs[1])},g.prototype.forceBranch=function(e,t){this.refs[e]||this.branch(e,t);var n=this.resolveID(e);if(n.get("type")!=="branch")throw new v({msg:l.str("git-error-options")});var r=this.getCommitFromRef(t);this.setTargetLocation(n,r)},g.prototype.branch=function(e,t){var n=this.getCommitFromRef(t);this.makeBranch(e,n)},g.prototype.deleteBranch=function(e){var t=this.resolveID(e);if(t.get("type")!=="branch"||t.get("id")=="master"||this.HEAD.get("target")===t)throw new v({msg:l.str("git-error-branch")});var n=t;this.branchCollection.remove(n),this.refs[n.get("id")]=undefined,delete this.refs[n.get("id")],n.get("visBranch")&&n.get("visBranch").remove()},g.prototype.unescapeQuotes=function(e){return e.replace(/&#x27;/g,"'")},g.prototype.filterError=function(e){if(!(e instanceof v||e instanceof m))throw e},g.prototype.dispatch=function(e,t){this.command=e,this.commandOptions=e.get("supportedMap"),this.generalArgs=e.get("generalArgs");var n=u.bind(function(){e.finishWith(t)},this);this.animationQueue=new h({callback:n});try{var r=e.get("method").replace(/-/g,"")+"Starter";this[r]()}catch(i){this.filterError(i),e.set("error",i),t.resolve();return}!this.animationQueue.get("animations").length&&!this.animationQueue.get("defer")&&this.animationFactory.refreshTree(this.animationQueue,this.gitVisuals),this.animationQueue.get("defer")||this.animationQueue.start()},g.prototype.showStarter=function(){this.oneArgImpliedHead(this.generalArgs),this.show(this.generalArgs[0])},g.prototype.show=function(e){var t=this.getCommitFromRef(e);throw new m({msg:t.getShowEntry()})},g.prototype.statusStarter=function(){var e=[];if(this.getDetachedHead())e.push(l.str("git-status-detached"));else{var t=this.HEAD.get("target").get("id");e.push(l.str("git-status-onbranch",{branch:t}))}e.push("Changes to be committed:"),e.push(""),e.push("&nbsp;&nbsp;&nbsp; modified: cal/OskiCostume.stl"),e.push(""),e.push(l.str("git-status-readytocommit"));var n="";throw u.each(e,function(e){n+="# "+e+"\n"}),new m({msg:n})},g.prototype.logStarter=function(){if(this.generalArgs.length==2){if(this.generalArgs[1][0]!="^")throw new v({msg:l.str("git-error-options")});this.logWithout(this.generalArgs[0],this.generalArgs[1])}this.oneArgImpliedHead(this.generalArgs),this.log(this.generalArgs[0])},g.prototype.logWithout=function(e,t){t=t.slice(1),this.log(e,this.getUpstreamSet(t))},g.prototype.log=function(e,t){t=t||{};var n=this.getCommitFromRef(e),r=[],i=[n],s={};while(i.length){var o=i.shift(0);if(s[o.get("id")]||t[o.get("id")])continue;s[o.get("id")]=!0,r.push(o),o.get("parents")&&o.get("parents").length&&(i=i.concat(o.get("parents")))}var a="";throw u.each(r,function(e){a+=e.getLogEntry()},this),new m({msg:a})},g.prototype.addStarter=function(){throw new m({msg:l.str("git-error-staging")})},g.prototype.getCommonAncestor=function(e,t){if(this.isUpstreamOf(t,e))throw new Error("Dont use common ancestor if we are upstream!");var n=this.getUpstreamSet(e),r=[this.getCommitFromRef(t)];while(r.length){var i=r.pop();if(n[i.get("id")])return i;r=r.concat(i.get("parents"))}throw new Error("something has gone very wrong... two nodes arent connected!")},g.prototype.isUpstreamOf=function(e,t){e=this.getCommitFromRef(e);var n=this.getUpstreamSet(t);return n[e.get("id")]!==undefined},g.prototype.getUpstreamSet=function(e){var t=this.getCommitFromRef(e),n=t.get("id"),r=[t],i={};i[n]=!0;var s=function(e){i[e.get("id")]=!0,r.push(e)};while(r.length){var o=r.pop(),a=o.get("parents");u.each(a,s)}return i};var y=a.Model.extend({initialize:function(){if(!this.get("target"))throw new Error("must be initialized with target");if(!this.get("id"))throw new Error("must be given an id");this.set("type","general ref"),this.get("id")=="HEAD"&&(this.set("lastLastTarget",null),this.set("lastTarget",this.get("target")),this.on("change:target",this.targetChanged,this))},targetChanged:function(e,t,n){this.set("lastLastTarget",this.get("lastTarget")),this.set("lastTarget",t)},toString:function(){return"a "+this.get("type")+"pointing to "+String(this.get("target"))}}),b=y.extend({defaults:{visBranch:null},initialize:function(){y.prototype.initialize.call(this),this.set("type","branch")}}),w=a.Model.extend({defaults:{type:"commit",children:null,parents:null,author:"Peter Cottle",createTime:null,commitMessage:null,visNode:null,gitVisuals:null},constants:{circularFields:["gitVisuals","visNode","children"]},getLogEntry:function(){return["Author: "+this.get("author"),"Date: "+this.get("createTime"),"<br/>",this.get("commitMessage"),"<br/>","Commit: "+this.get("id")].join("\n")+"\n"},getShowEntry:function(){return[this.getLogEntry(),"diff --git a/bigGameResults.html b/bigGameResults.html","--- bigGameResults.html","+++ bigGameResults.html","@@ 13,27 @@ Winner, Score","- Stanfurd, 14-7","+ Cal, 21-14"].join("\n")+"\n"},validateAtInit:function(){if(!this.get("id"))throw new Error("Need ID!!");this.get("createTime")||this.set("createTime",(new Date).toString()),this.get("commitMessage")||this.set("commitMessage",l.str("git-dummy-msg")),this.set("children",[]);if(!this.get("rootCommit"))if(!this.get("parents")||!this.get("parents").length)throw new Error("needs parents")},addNodeToVisuals:function(){var e=this.get("gitVisuals").addNode(this.get("id"),this);this.set("visNode",e)},addEdgeToVisuals:function(e){this.get("gitVisuals").addEdge(this.get("id"),e.get("id"))},getParent:function(e){return this&&this.attributes&&this.attributes.parents?this.attributes.parents[e]:null},isMainParent:function(e){var t=this.get("parents").indexOf(e);return t===0},initialize:function(e){this.validateAtInit(),this.addNodeToVisuals(),u.each(this.get("parents"),function(e){e.get("children").push(this),this.addEdgeToVisuals(e)},this)}});n.GitEngine=g,n.Commit=w,n.Branch=b,n.Ref=y}),e.define("/src/js/visuals/animation/animationFactory.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("./index").Animation,l=e("../../util/constants").GRAPHICS,c=function(){};c.prototype.genCommitBirthAnimation=function(e,t,n){if(!e)throw new Error("Need animation queue to add closure to!");var r=l.defaultAnimationTime*1,i=r*2,s=t.get("visNode"),o=function(){n.refreshTree(r),s.setBirth(),s.parentInFront(),n.visBranchesFront(),s.animateUpdatedPosition(i,"bounce"),s.animateOutgoingEdges(r)};e.add(new f({closure:o,duration:Math.max(r,i)}))},c.prototype.overrideOpacityDepth2=function(e,t){t=t===undefined?1:t;var n={};return u.each(e,function(e,r){n[r]={},u.each(e,function(e,i){i=="opacity"?n[r][i]=t:n[r][i]=e})}),n},c.prototype.overrideOpacityDepth3=function(e,t){var n={};return u.each(e,function(e,r){n[r]=this.overrideOpacityDepth2(e,t)},this),n},c.prototype.genCommitBirthClosureFromSnapshot=function(e,t){var n=l.defaultAnimationTime*1,r=n*1.5,i=e.newCommit.get("visNode"),s=this.overrideOpacityDepth2(e.afterSnapshot[i.getID()]),o=this.overrideOpacityDepth3(e.afterSnapshot),u=function(){i.setBirthFromSnapshot(e.beforeSnapshot),i.parentInFront(),t.visBranchesFront(),i.animateToAttr(s,r,"bounce"),i.animateOutgoingEdgesToAttr(o,r)};return u},c.prototype.refreshTree=function(e,t){e.add(new f({closure:function(){t.refreshTree()}}))},c.prototype.rebaseAnimation=function(e,t,n,r){this.rebaseHighlightPart(e,t,n),this.rebaseBirthPart(e,t,n,r)},c.prototype.rebaseHighlightPart=function(e,t,n){var r=l.defaultAnimationTime*.66,i=r*2,s=t.toRebaseArray,o=t.destinationBranch.get("visBranch");o||(o=t.destinationBranch.get("visNode")),u.each(s,function(t){var n=t.get("visNode");e.add(new f({closure:function(){n.highlightTo(o,i,"easeInOut")},duration:r*1.5}))},this),this.delay(e,r*2)},c.prototype.rebaseBirthPart=function(e,t,n,r){var i=t.rebaseSteps,s=[];u.each(i,function(e){var t=e.newCommit.get("visNode");s.push(t),t.setOpacity(0),t.setOutgoingEdgesOpacity(0)},this);var o=[];u.each(i,function(t,n){var i=s.slice(n+1),u=this.genFromToSnapshotAnimation(t.beforeSnapshot,t.afterSnapshot,i,o,r),a=this.genCommitBirthClosureFromSnapshot(t,r),c=function(){u(),a()};e.add(new f({closure:c,duration:l.defaultAnimationTime*1.5})),o.push(t.newCommit.get("visNode"))},this),this.delay(e),this.refreshTree(e,r)},c.prototype.delay=function(e,t){t=t||l.defaultAnimationTime,e.add(new f({closure:function(){},duration:t}))},c.prototype.genSetAllCommitOpacities=function(e,t){var n=e.slice(0);return function(){u.each(n,function(e){e.setOpacity(t),e.setOutgoingEdgesOpacity(t)})}},c.prototype.stripObjectsFromSnapshot=function(e,t){var n=[];u.each(t,function(e){n.push(e.getID())});var r={};return u.each(e,function(e,t){if(u.include(n,t))return;r[t]=e},this),r},c.prototype.genFromToSnapshotAnimation=function(e,t,n,r,i){var s=[];u.each(n,function(e){s.push(e),s=s.concat(e.get("outgoingEdges"))});var o=function(e){if(!e)return;u.each(e,function(t,n){e[n].opacity=1})};return u.each([e,t],function(e){u.each(r,function(t){o(e[t.getID()]),u.each(t.get("outgoingEdges"),function(t){o(e[t.getID()])})})}),function(){i.animateAllFromAttrToAttr(e,t,s)}},n.AnimationFactory=c}),e.define("/src/js/visuals/animation/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../../util/constants").GLOBAL,l=a.Model.extend({defaults:{duration:300,closure:null},validateAtInit:function(){if(!this.get("closure"))throw new Error("give me a closure!")},initialize:function(e){this.validateAtInit()},run:function(){this.get("closure")()}}),c=a.Model.extend({defaults:{animations:null,index:0,callback:null,defer:!1},initialize:function(e){this.set("animations",[]),e.callback||console.warn("no callback")},add:function(e){if(!e instanceof l)throw new Error("Need animation not something else");this.get("animations").push(e)},start:function(){this.set("index",0),f.isAnimating=!0,this.next()},finish:function(){f.isAnimating=!1,this.get("callback")()},next:function(){var e=this.get("animations"),t=this.get("index");if(t>=e.length){this.finish();return}var n=e[t],r=n.get("duration");n.run(),this.set("index",t+1),setTimeout(u.bind(function(){this.next()},this),r)}});n.Animation=l,n.AnimationQueue=c}),e.define("/src/js/git/treeCompare.js",function(e,t,n,r,i,s,o){function a(){}var u=e("underscore");a.prototype.compareAllBranchesWithinTreesAndHEAD=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),e.HEAD.target==t.HEAD.target&&this.compareAllBranchesWithinTrees(e,t)},a.prototype.compareAllBranchesWithinTrees=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t);var n=u.extend({},e.branches,t.branches),r=!0;return u.uniq(n,function(n,i){r=r&&this.compareBranchWithinTrees(e,t,i)},this),r},a.prototype.compareBranchesWithinTrees=function(e,t,n){var r=!0;return u.each(n,function(n){r=r&&this.compareBranchWithinTrees(e,t,n)},this),r},a.prototype.compareBranchWithinTrees=function(e,t,n){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var r=this.getRecurseCompare(e,t),i=e.branches[n],s=t.branches[n];return u.isEqual(i,s)&&r(e.commits[i.target],t.commits[s.target])},a.prototype.compareAllBranchesWithinTreesHashAgnostic=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var n=u.extend({},e.branches,t.branches),r=[];return u.each(n,function(e,t){r.push(t)}),this.compareBranchesWithinTreesHashAgnostic(e,t,r)},a.prototype.compareBranchesWithinTreesHashAgnostic=function(e,t,n){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var r=u.bind(function(e,t){return!e||!t?!1:(e=u.clone(e),t=u.clone(t),e.target=this.getBaseRef(e.target),t.target=this.getBaseRef(t.target),u.isEqual(e,t))},this),i=this.getRecurseCompareHashAgnostic(e,t),s=!0;return u.each(n,function(n){var o=e.branches[n],u=t.branches[n];s=s&&r(o,u)&&i(e.commits[o.target],t.commits[u.target])},this),s},a.prototype.evalAsserts=function(e,t){var n=!0;return u.each(t,function(t,r){n=n&&this.evalAssertsOnBranch(e,r,t)},this),console.log("EVAL ASSETS was",n),n},a.prototype.evalAssertsOnBranch=function(e,t,n){e=this.convertTreeSafe(e),console.log("doing asserts on",t);if(!e.branches[t])return!1;var r=e.branches[t],i=[r.target],s={};while(i.length){var o=i.pop();console.log(o),s[this.getBaseRef(o)]=this.getNumHashes(o),i=i.concat(e.commits[o].parents)}console.log("data is",s);var a=!0;return u.each(n,function(e){try{a=a&&e(s)}catch(t){console.err(t),a=!1}}),a},a.prototype.getNumHashes=function(e){var t=[[/^C(\d+)([']{0,3})$/,function(e){return e[2]?e[2].length:0}],[/^C(\d+)['][\^](\d+)$/,function(e){return Number(e[2])}]];for(var n=0;n<t.length;n++){var r=t[n][0],i=t[n][1],s=r.exec(e);if(s)return i(s)}throw new Error("coudlnt parse ref "+e)},a.prototype.getBaseRef=function(e){var t=/^C(\d+)/,n=t.exec(e);if(!n)throw new Error("no regex matchy for "+e);return"C"+n[1]},a.prototype.getRecurseCompareHashAgnostic=function(e,t){var n=u.bind(function(e){return e?u.extend({},e,{id:this.getBaseRef(e.id),parents:null}):{}},this),r=function(e,t){return u.isEqual(n(e),n(t))};return this.getRecurseCompare(e,t,{isEqual:r})},a.prototype.getRecurseCompare=function(e,t,n){n=n||{};var r=function(i,s){var o=n.isEqual?n.isEqual(i,s):u.isEqual(i,s);if(!o)return!1;var a=Math.max(i.parents.length,s.parents.length);return u.each(u.range(a),function(n){var u=i.parents[n],a=s.parents[n],f=e.commits[u],l=t.commits[a];o=o&&r(f,l)},this),o};return r},a.prototype.convertTreeSafe=function(e){return typeof e=="string"?JSON.parse(unescape(e)):e},a.prototype.reduceTreeFields=function(e){var t=["parents","id","rootCommit"],n=["children","parents"],r=["target","id"],i=function(e,t,n,r){var i=e[t];u.each(i,function(i,s){var o={};u.each(n,function(e){i[e]!==undefined&&(o[e]=i[e])}),u.each(r,function(e){i[e]&&(i[e].sort(),o[e]=i[e])}),e[t][s]=o})};u.each(e,function(e){i(e,"commits",t,n),i(e,"branches",r),e.HEAD={target:e.HEAD.target,id:e.HEAD.id}})},a.prototype.compareTrees=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]),u.isEqual(e,t)},n.TreeCompare=a}),e.define("/src/js/views/rebaseView.js",function(e,t,n,r,i,s,o){var u=e("../util/errors").GitError,a=e("underscore"),f=e("q"),l=e("../util").isBrowser()?window.Backbone:e("backbone"),c=e("../views").ModalTerminal,h=e("../views").ContainedBase,p=e("../views").ConfirmCancelView,d=e("../views").LeftRightView,v=h.extend({tagName:"div",template:a.template($("#interactive-rebase-template").html()),initialize:function(e){this.deferred=e.deferred,this.rebaseMap={},this.entryObjMap={},this.rebaseEntries=new g,e.toRebase.reverse(),a.each(e.toRebase,function(e){var t=e.get("id");this.rebaseMap[t]=e,this.entryObjMap[t]=new m({id:t}),this.rebaseEntries.add(this.entryObjMap[t])},this),this.container=new c({title:"Interactive Rebase"}),this.render(),this.show()},confirm:function(){this.die();var e=[];this.$("ul.rebaseEntries li").each(function(t,n){e.push(n.id)});var t=[];a.each(e,function(e){this.entryObjMap[e].get("pick")&&t.unshift(this.rebaseMap[e])},this),t.reverse(),this.deferred.resolve(t),this.$el.html("")},render:function(){var e={num:a.keys(this.rebaseMap).length},t=this.container.getInsideElement();this.$el.html(this.template(e)),$(t).append(this.el);var n=this.$("ul.rebaseEntries");this.rebaseEntries.each(function(e){new y({el:n,model:e})},this),n.sortable({axis:"y",placeholder:"rebaseEntry transitionOpacity ui-state-highlight",appendTo:"parent"}),this.makeButtons()},makeButtons:function(){var e=f.defer();e.promise.then(a.bind(function(){this.confirm()},this)).fail(a.bind(function(){this.hide(),this.deferred.resolve([])},this)).done(),new p({destination:this.$(".confirmCancel"),deferred:e})}}),m=l.Model.extend({defaults:{pick:!0},toggle:function(){this.set("pick",!this.get("pick"))}}),g=l.Collection.extend({model:m}),y=l.View.extend({tagName:"li",template:a.template($("#interactive-rebase-entry-template").html()),toggle:function(){this.model.toggle(),this.listEntry.toggleClass("notPicked",!this.model.get("pick"))},initialize:function(e){this.render()},render:function(){var e=this.model.toJSON();this.$el.append(this.template(this.model.toJSON())),this.listEntry=this.$el.children(":last"),this.listEntry.delegate("#toggleButton","click",a.bind(function(){this.toggle()},this))}});n.InteractiveRebaseView=v}),e.define("/src/js/views/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../app"),c=e("../intl"),h=e("../util/constants"),p=e("../util/keyboard").KeyboardListener,d=e("../util/errors").GitError,v=f.View.extend({getDestination:function(){return this.destination||this.container.getInsideElement()},tearDown:function(){this.$el.remove(),this.container&&this.container.tearDown()},renderAgain:function(e){e=e||this.template(this.JSON),this.$el.html(e)},render:function(e){this.renderAgain(e);var t=this.getDestination();$(t).append(this.el)}}),m=v.extend({resolve:function(){this.deferred.resolve()},reject:function(){this.deferred.reject()}}),g=v.extend({positive:function(){this.navEvents.trigger("positive")},negative:function(){this.navEvents.trigger("negative")}}),y=v.extend({getAnimationTime:function(){return 700},show:function(){this.container.show()},hide:function(){this.container.hide()},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime()*1.1)}}),b=y.extend({tagName:"a",className:"generalButton uiButton",template:u.template($("#general-button").html()),events:{click:"click"},initialize:function(e){e=e||{},this.navEvents=e.navEvents||u.clone(f.Events),this.destination=e.destination,this.destination||(this.container=new x),this.JSON={buttonText:e.buttonText||"General Button",wantsWrapper:e.wantsWrapper!==undefined?e.wantsWrapper:!0},this.render(),this.container&&!e.wait&&this.show()},click:function(){this.clickFunc||(this.clickFunc=u.throttle(u.bind(this.sendClick,this),500)),this.clickFunc()},sendClick:function(){this.navEvents.trigger("click")}}),w=m.extend({tagName:"div",className:"confirmCancelView box horizontal justify",template:u.template($("#confirm-cancel-template").html()),events:{"click .confirmButton":"resolve","click .cancelButton":"reject"},initialize:function(e){if(!e.destination)throw new Error("needmore");this.destination=e.destination,this.deferred=e.deferred||a.defer(),this.JSON={confirm:e.confirm||"Confirm",cancel:e.cancel||"Cancel"},this.render()}}),E=g.extend({tagName:"div",className:"leftRightView box horizontal center",template:u.template($("#left-right-template").html()),events:{"click .left":"negative","click .right":"positive"},positive:function(){this.pipeEvents.trigger("positive"),E.__super__.positive.apply(this)},negative:function(){this.pipeEvents.trigger("negative"),E.__super__.negative.apply(this)},initialize:function(e){if(!e.destination||!e.events)throw new Error("needmore");this.destination=e.destination,this.pipeEvents=e.events,this.navEvents=u.clone(f.Events),this.JSON={showLeft:e.showLeft===undefined?!0:e.showLeft,lastNav:e.lastNav===undefined?!1:e.lastNav},this.render()}}),S=f.View.extend({tagName:"div",className:"modalView box horizontal center transitionOpacityLinear",template:u.template($("#modal-view-template").html()),getAnimationTime:function(){return 700},initialize:function(e){this.shown=!1,this.render()},render:function(){this.$el.html(this.template({})),$("body").append(this.el)},stealKeyboard:function(){l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this),l.getEventBaton().stealBaton("windowFocus",this.onWindowFocus,this),l.getEventBaton().stealBaton("documentClick",this.onDocumentClick,this),$("#commandTextField").blur()},releaseKeyboard:function(){l.getEventBaton().releaseBaton("keydown",this.onKeyDown,this),l.getEventBaton().releaseBaton("keyup",this.onKeyUp,this),l.getEventBaton().releaseBaton("windowFocus",this.onWindowFocus,this),l.getEventBaton().releaseBaton("documentClick",this.onDocumentClick,this),l.getEventBaton().trigger("windowFocus")},onWindowFocus:function(e){},onDocumentClick:function(e){},onKeyDown:function(e){e.preventDefault()},onKeyUp:function(e){e.preventDefault()},show:function(){this.toggleZ(!0),s.nextTick(u.bind(function(){this.toggleShow(!0)},this))},hide:function(){this.toggleShow(!1),setTimeout(u.bind(function(){this.shown||this.toggleZ(!1)},this),this.getAnimationTime())},getInsideElement:function(){return this.$(".contentHolder")},toggleShow:function(e){if(this.shown===e)return;e?this.stealKeyboard():this.releaseKeyboard(),this.shown=e,this.$el.toggleClass("show",e)},toggleZ:function(e){this.$el.toggleClass("inFront",e)},tearDown:function(){this.$el.html(""),$("body")[0].removeChild(this.el)}}),x=y.extend({tagName:"div",className:"modalTerminal box flex1",template:u.template($("#terminal-window-template").html()),events:{"click div.inside":"onClick"},initialize:function(e){e=e||{},this.navEvents=e.events||u.clone(f.Events),this.container=new S,this.JSON={title:e.title||"Heed This Warning!"},this.render()},onClick:function(){this.navEvents.trigger("click")},getInsideElement:function(){return this.$(".inside")}}),T=y.extend({tagName:"div",template:u.template($("#modal-alert-template").html()),initialize:function(e){e=e||{},this.JSON={title:e.title||"Something to say",text:e.text||"Here is a paragraph",markdown:e.markdown},e.markdowns&&(this.JSON.markdown=e.markdowns.join("\n")),this.container=new x({title:"Alert!"}),this.render(),e.wait||this.show()},render:function(){var t=this.JSON.markdown?e("markdown").markdown.toHTML(this.JSON.markdown):this.template(this.JSON);T.__super__.render.apply(this,[t])}}),N=f.View.extend({initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.modalAlert=new T(u.extend({},{markdown:"#you sure?"},e));var t=a.defer();this.buttonDefer=t,this.confirmCancel=new w({deferred:t,destination:this.modalAlert.getDestination()}),t.promise.then(this.deferred.resolve).fail(this.deferred.reject).done(u.bind(function(){this.close()},this)),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new p({events:this.navEvents,aliasMap:{enter:"positive",esc:"negative"}}),e.wait||this.modalAlert.show()},positive:function(){this.buttonDefer.resolve()},negative:function(){this.buttonDefer.reject()},getAnimationTime:function(){return 700},show:function(){this.modalAlert.show()},hide:function(){this.modalAlert.hide()},getPromise:function(){return this.deferred.promise},close:function(){this.keyboardListener.mute(),this.modalAlert.die()}}),C=N.extend({initialize:function(t){t=t||{};var n=t.nextLevel?c.getName(t.nextLevel):"",r=c.getDialog(e("../dialogs/nextLevel"))[0].options.markdowns,i=r.join("\n");i=c.template(i,{numCommands:t.numCommands,best:t.best}),t.numCommands<=t.best?i=i+"\n\n"+c.str("finish-dialog-win"):i=i+"\n\n"+c.str("finish-dialog-lose",{best:t.best}),i+="\n\n",t.nextLevel?i+=c.str("finish-dialog-next",{nextLevel:n}):i+=c.str("finish-dialog-finished"),t=u.extend({},t,{markdown:i}),C.__super__.initialize.apply(this,[t])}}),k=f.View.extend({initialize:function(e){this.grabBatons(),this.modalAlert=new T({markdowns:this.markdowns}),this.modalAlert.show()},grabBatons:function(){l.getEventBaton().stealBaton(this.eventBatonName,this.batonFired,this)},releaseBatons:function(){l.getEventBaton().releaseBaton(this.eventBatonName,this.batonFired,this)},finish:function(){this.releaseBatons(),this.modalAlert.die()}}),L=k.extend({initialize:function(e){this.eventBatonName="windowSizeCheck",this.markdowns=["## That window size is not supported :-/","Please resize your window back to a supported size","","(and of course, pull requests to fix this are appreciated :D)"],L.__super__.initialize.apply(this,[e])},batonFired:function(e){e.w>h.VIEWPORT.minWidth&&e.h>h.VIEWPORT.minHeight&&this.finish()}}),A=k.extend({initialize:function(e){if(!e||!e.level)throw new Error("need level");this.eventBatonName="zoomChange",this.markdowns=["## That zoom level of "+e.level+" is not supported :-/","Please zoom back to a supported zoom level with Ctrl + and Ctrl -","","(and of course, pull requests to fix this are appreciated :D)"],A.__super__.initialize.apply(this,[e])},batonFired:function(e){e<=h.VIEWPORT.maxZoom&&e>=h.VIEWPORT.minZoom&&this.finish()}}),O=v.extend({tagName:"div",className:"levelToolbarHolder",template:u.template($("#level-toolbar-template").html()),initialize:function(e){e=e||{},this.JSON={name:e.name||"Some level! (unknown name)"},this.beforeDestination=$($("#commandLineHistory div.toolbar")[0]),this.render(),e.wait||s.nextTick(u.bind(this.show,this))},getAnimationTime:function(){return 700},render:function(){var e=this.template(this.JSON);this.$el.html(e),this.beforeDestination.after(this.el)},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime())},hide:function(){this.$("div.toolbar").toggleClass("hidden",!0)},show:function(){this.$("div.toolbar").toggleClass("hidden",!1)}}),M=v.extend({tagName:"div",className:"helperBar transitionAll",template:u.template($("#helper-bar-template").html()),events:{"click a":"onClick"},onClick:function(e){var t=e.target,n=$(t).attr("data-id"),r="on"+n[0].toUpperCase()+n.slice(1)+"Click";this[r].call(this)},show:function(){this.$el.toggleClass("show",!0)},hide:function(){this.$el.toggleClass("show",!1),this.deferred&&this.deferred.resolve()},getItems:function(){return[]},setupChildren:function(){},fireCommand:function(e){l.getEventBaton().trigger("commandSubmitted",e)},showDeferMe:function(e){this.hide();var t=a.defer();e.deferred=t,t.promise.then(u.bind(function(){this.show()},this)),e.show()},onExitClick:function(){this.hide()},initialize:function(e){e=e||{},this.destination=$("body"),this.JSON={items:this.getItems()},this.render(),this.setupChildren(),e.wait||this.show()}}),_=M.extend({getItems:function(){return[{text:"Git Branching",id:"english"},{text:"Git ",id:"korean"},{text:"Git",id:"chinese"},{text:"Français(e)",id:"french"},{icon:"signout",id:"exit"}]},onEnglishClick:function(){this.fireCommand("locale en_US; levels"),this.hide()},onKoreanClick:function(){this.fireCommand("locale ko; levels"),this.hide()},onFrenchClick:function(){this.fireCommand("locale fr_FR; levels"),this.hide()},onChineseClick:function(){this.fireCommand("locale zh_CN; levels"),this.hide()}}),D=M.extend({getItems:function(){return[{text:"Levels",id:"levels"},{text:"Reset",id:"reset"},{text:"Undo",id:"undo"},{text:"Help",id:"help"},{icon:"signout",id:"exit"}]},onLevelsClick:function(){this.fireCommand("levels")},onResetClick:function(){this.fireCommand("reset")},onUndoClick:function(){this.fireCommand("undo")},onHelpClick:function(){this.fireCommand("help general; git help")}}),P=M.extend({getItems:function(){return[{text:"?",id:"commands"},{icon:"globe",id:"intl"}]},onIntlClick:function(){this.showDeferMe(this.intlHelper)},onCommandsClick:function(){this.showDeferMe(this.commandsHelper)},setupChildren:function(){this.commandsHelper=new D({wait:!0}),this.intlHelper=new _({wait:!0})}}),H=v.extend({tagName:"div",className:"canvasTerminalHolder box flex1",template:u.template($("#terminal-window-bare-template").html()),events:{"click div.wrapper":"onClick"},initialize:function(e){e=e||{},this.destination=$("body"),this.JSON={title:e.title||c.str("goal-to-reach"),text:e.text||c.str("hide-goal")},this.render(),this.inDom=!0,e.additionalClass&&this.$el.addClass(e.additionalClass)},getAnimationTime:function(){return 700},onClick:function(){this.die()},die:function(){this.slideOut(),this.inDom=!1,setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime())},slideOut:function(){this.slideToggle(!0)},slideIn:function(){this.slideToggle(!1)},slideToggle:function(e){this.$("div.terminal-window-holder").toggleClass("slideOut",e)},getCanvasLocation:function(){return this.$("div.inside")[0]}});n.BaseView=v,n.GeneralButton=b,n.ModalView=S,n.ModalTerminal=x,n.ModalAlert=T,n.ContainedBase=y,n.ConfirmCancelView=w,n.LeftRightView=E,n.ZoomAlertWindow=A,n.ConfirmCancelTerminal=N,n.WindowSizeAlertWindow=L,n.MainHelperBar=P,n.CanvasTerminalHolder=H,n.LevelToolbar=O,n.NextLevelConfirm=C}),e.define("/src/js/util/keyboard.js",function(e,t,n,r,i,s,o){function c(e){this.events=e.events||u.clone(a.Events),this.aliasMap=e.aliasMap||{},e.wait||this.listen()}var u=e("underscore"),a=e("backbone"),f=e("../app"),l=function(e){var t={37:"left",38:"up",39:"right",40:"down",27:"esc",13:"enter"};return t[e]};c.prototype.listen=function(){if(this.listening)return;this.listening=!0,f.getEventBaton().stealBaton("docKeydown",this.keydown,this)},c.prototype.mute=function(){this.listening=!1,f.getEventBaton().releaseBaton("docKeydown",this.keydown,this)},c.prototype.keydown=function(e){var t=e.which||e.keyCode,n=l(t);if(n===undefined)return;this.fireEvent(n,e)},c.prototype.fireEvent=function(e,t){e=this.aliasMap[e]||e,this.events.trigger(e,t)},c.prototype.passEventBack=function(e){f.getEventBaton().passBatonBackSoft("docKeydown",this.keydown,this,[e])},n.KeyboardListener=c,n.mapKeycodeToKey=l}),e.define("/node_modules/markdown/package.json",function(e,t,n,r,i,s,o){t.exports={main:"./lib/index.js"}}),e.define("/node_modules/markdown/lib/index.js",function(e,t,n,r,i,s,o){n.markdown=e("./markdown"),n.parse=n.markdown.toHTML}),e.define("/node_modules/markdown/lib/markdown.js",function(e,t,n,r,i,s,o){(function(t){function r(){return"Markdown.mk_block( "+uneval(this.toString())+", "+uneval(this.trailing)+", "+uneval(this.lineNumber)+" )"}function i(){var t=e("util");return"Markdown.mk_block( "+t.inspect(this.toString())+", "+t.inspect(this.trailing)+", "+t.inspect(this.lineNumber)+" )"}function o(e){var t=0,n=-1;while((n=e.indexOf("\n",n+1))!==-1)t++;return t}function u(e,t){function i(e){this.len_after=e,this.name="close_"+t}var n=e+"_state",r=e=="strong"?"em_state":"strong_state";return function(s,o){if(this[n][0]==t)return this[n].shift(),[s.length,new i(s.length-t.length)];var u=this[r].slice(),a=this[n].slice();this[n].unshift(t);var f=this.processInline(s.substr(t.length)),l=f[f.length-1],c=this[n].shift();if(l instanceof i){f.pop();var h=s.length-l.len_after;return[h,[e].concat(f)]}return this[r]=u,this[n]=a,[t.length,t]}}function f(e){var t=e.split(""),n=[""],r=!1;while(t.length){var i=t.shift();switch(i){case" ":r?n[n.length-1]+=i:n.push("");break;case"'":case'"':r=!r;break;case"\\":i=t.shift();default:n[n.length-1]+=i}}return n}function h(e){return l(e)&&e.length>1&&typeof e[1]=="object"&&!l(e[1])?e[1]:undefined}function d(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function v(e){if(typeof e=="string")return d(e);var t=e.shift(),n={},r=[];e.length&&typeof e[0]=="object"&&!(e[0]instanceof Array)&&(n=e.shift());while(e.length)r.push(arguments.callee(e.shift()));var i="";for(var s in n)i+=" "+s+'="'+d(n[s])+'"';return t=="img"||t=="br"||t=="hr"?"<"+t+i+"/>":"<"+t+i+">"+r.join("")+"</"+t+">"}function m(e,t,n){var r;n=n||{};var i=e.slice(0);typeof n.preprocessTreeNode=="function"&&(i=n.preprocessTreeNode(i,t));var s=h(i);if(s){i[1]={};for(r in s)i[1][r]=s[r];s=i[1]}if(typeof i=="string")return i;switch(i[0]){case"header":i[0]="h"+i[1].level,delete i[1].level;break;case"bulletlist":i[0]="ul";break;case"numberlist":i[0]="ol";break;case"listitem":i[0]="li";break;case"para":i[0]="p";break;case"markdown":i[0]="html",s&&delete s.references;break;case"code_block":i[0]="pre",r=s?2:1;var o=["code"];o.push.apply(o,i.splice(r)),i[r]=o;break;case"inlinecode":i[0]="code";break;case"img":i[1].src=i[1].href,delete i[1].href;break;case"linebreak":i[0]="br";break;case"link":i[0]="a";break;case"link_ref":i[0]="a";var u=t[s.ref];if(!u)return s.original;delete s.ref,s.href=u.href,u.title&&(s.title=u.title),delete s.original;break;case"img_ref":i[0]="img";var u=t[s.ref];if(!u)return s.original;delete s.ref,s.src=u.href,u.title&&(s.title=u.title),delete s.original}r=1;if(s){for(var a in i[1])r=2;r===1&&i.splice(r,1)}for(;r<i.length;++r)i[r]=arguments.callee(i[r],t,n);return i}function g(e){var t=h(e)?2:1;while(t<e.length)typeof e[t]=="string"?t+1<e.length&&typeof e[t+1]=="string"?e[t]+=e.splice(t+1,1)[0]:++t:(arguments.callee(e[t]),++t)}var n=t.Markdown=function y(e){switch(typeof e){case"undefined":this.dialect=y.dialects.Gruber;break;case"object":this.dialect=e;break;default:if(!(e in y.dialects))throw new Error("Unknown Markdown dialect '"+String(e)+"'");this.dialect=y.dialects[e]}this.em_state=[],this.strong_state=[],this.debug_indent=""};t.parse=function(e,t){var r=new n(t);return r.toTree(e)},t.toHTML=function(n,r,i){var s=t.toHTMLTree(n,r,i);return t.renderJsonML(s)},t.toHTMLTree=function(t,n,r){typeof t=="string"&&(t=this.parse(t,n));var i=h(t),s={};i&&i.references&&(s=i.references);var o=m(t,s,r);return g(o),o};var s=n.mk_block=function(e,t,n){arguments.length==1&&(t="\n\n");var s=new String(e);return s.trailing=t,s.inspect=i,s.toSource=r,n!=undefined&&(s.lineNumber=n),s};n.prototype.split_blocks=function(t,n){var r=/([\s\S]+?)($|\n(?:\s*\n|$)+)/g,i=[],u,a=1;(u=/^(\s*\n)/.exec(t))!=null&&(a+=o(u[0]),r.lastIndex=u[0].length);while((u=r.exec(t))!==null)i.push(s(u[1],u[2],a)),a+=o(u[0]);return i},n.prototype.processBlock=function(t,n){var r=this.dialect.block,i=r.__order__;if("__call__"in r)return r.__call__.call(this,t,n);for(var s=0;s<i.length;s++){var o=r[i[s]].call(this,t,n);if(o)return(!l(o)||o.length>0&&!l(o[0]))&&this.debug(i[s],"didn't return a proper array"),o}return[]},n.prototype.processInline=function(t){return this.dialect.inline.__call__.call(this,String(t))},n.prototype.toTree=function(t,n){var r=t instanceof Array?t:this.split_blocks(t),i=this.tree;try{this.tree=n||this.tree||["markdown"];e:while(r.length){var s=this.processBlock(r.shift(),r);if(!s.length)continue e;this.tree.push.apply(this.tree,s)}return this.tree}finally{n&&(this.tree=i)}},n.prototype.debug=function(){var e=Array.prototype.slice.call(arguments);e.unshift(this.debug_indent),typeof print!="undefined"&&print.apply(print,e),typeof console!="undefined"&&typeof console.log!="undefined"&&console.log.apply(null,e)},n.prototype.loop_re_over_block=function(e,t,n){var r,i=t.valueOf();while(i.length&&(r=e.exec(i))!=null)i=i.substr(r[0].length),n.call(this,r);return i},n.dialects={},n.dialects.Gruber={block:{atxHeader:function(t,n){var r=t.match(/^(#{1,6})\s*(.*?)\s*#*\s*(?:\n|$)/);if(!r)return undefined;var i=["header",{level:r[1].length}];return Array.prototype.push.apply(i,this.processInline(r[2])),r[0].length<t.length&&n.unshift(s(t.substr(r[0].length),t.trailing,t.lineNumber+2)),[i]},setextHeader:function(t,n){var r=t.match(/^(.*)\n([-=])\2\2+(?:\n|$)/);if(!r)return undefined;var i=r[2]==="="?1:2,o=["header",{level:i},r[1]];return r[0].length<t.length&&n.unshift(s(t.substr(r[0].length),t.trailing,t.lineNumber+2)),[o]},code:function(t,n){var r=[],i=/^(?: {0,3}\t| {4})(.*)\n?/,o;if(!t.match(i))return undefined;e:do{var u=this.loop_re_over_block(i,t.valueOf(),function(e){r.push(e[1])});if(u.length){n.unshift(s(u,t.trailing));break e}if(!n.length)break e;if(!n[0].match(i))break e;r.push(t.trailing.replace(/[^\n]/g,"").substring(2)),t=n.shift()}while(!0);return[["code_block",r.join("\n")]]},horizRule:function(t,n){var r=t.match(/^(?:([\s\S]*?)\n)?[ \t]*([-_*])(?:[ \t]*\2){2,}[ \t]*(?:\n([\s\S]*))?$/);if(!r)return undefined;var i=[["hr"]];return r[1]&&i.unshift.apply(i,this.processBlock(r[1],[])),r[3]&&n.unshift(s(r[3])),i},lists:function(){function o(t){return new RegExp("(?:^("+i+"{0,"+t+"} {0,3})("+e+")\\s+)|"+"(^"+i+"{0,"+(t-1)+"}[ ]{0,4})")}function u(e){return e.replace(/ {0,3}\t/g," ")}function a(e,t,n,r){if(t){e.push(["para"].concat(n));return}var i=e[e.length-1]instanceof Array&&e[e.length-1][0]=="para"?e[e.length-1]:e;r&&e.length>1&&n.unshift(r);for(var s=0;s<n.length;s++){var o=n[s],u=typeof o=="string";u&&i.length>1&&typeof i[i.length-1]=="string"?i[i.length-1]+=o:i.push(o)}}function f(e,t){var n=new RegExp("^("+i+"{"+e+"}.*?\\n?)*$"),r=new RegExp("^"+i+"{"+e+"}","gm"),o=[];while(t.length>0){if(n.exec(t[0])){var u=t.shift(),a=u.replace(r,"");o.push(s(a,u.trailing,u.lineNumber))}break}return o}function l(e,t,n){var r=e.list,i=r[r.length-1];if(i[1]instanceof Array&&i[1][0]=="para")return;if(t+1==n.length)i.push(["para"].concat(i.splice(1)));else{var s=i.pop();i.push(["para"].concat(i.splice(1)),s)}}var e="[*+-]|\\d+\\.",t=/[*+-]/,n=/\d+\./,r=new RegExp("^( {0,3})("+e+")[ ]+"),i="(?: {0,3}\\t| {4})";return function(e,n){function s(e){var n=t.exec(e[2])?["bulletlist"]:["numberlist"];return h.push({list:n,indent:e[1]}),n}var i=e.match(r);if(!i)return undefined;var h=[],p=s(i),d,v=!1,m=[h[0].list],g;e:for(;;){var y=e.split(/(?=\n)/),b="";for(var w=0;w<y.length;w++){var E="",S=y[w].replace(/^\n/,function(e){return E=e,""}),x=o(h.length);i=S.match(x);if(i[1]!==undefined){b.length&&(a(d,v,this.processInline(b),E),v=!1,b=""),i[1]=u(i[1]);var T=Math.floor(i[1].length/4)+1;if(T>h.length)p=s(i),d.push(p),d=p[1]=["listitem"];else{var N=!1;for(g=0;g<h.length;g++){if(h[g].indent!=i[1])continue;p=h[g].list,h.splice(g+1),N=!0;break}N||(T++,T<=h.length?(h.splice(T),p=h[T-1].list):(p=s(i),d.push(p))),d=["listitem"],p.push(d)}E=""}S.length>i[0].length&&(b+=E+S.substr(i[0].length))}b.length&&(a(d,v,this.processInline(b),E),v=!1,b="");var C=f(h.length,n);C.length>0&&(c(h,l,this),d.push.apply(d,this.toTree(C,[])));var k=n[0]&&n[0].valueOf()||"";if(k.match(r)||k.match(/^ /)){e=n.shift();var L=this.dialect.block.horizRule(e,n);if(L){m.push.apply(m,L);break}c(h,l,this),v=!0;continue e}break}return m}}(),blockquote:function(t,n){if(!t.match(/^>/m))return undefined;var r=[];if(t[0]!=">"){var i=t.split(/\n/),s=[];while(i.length&&i[0][0]!=">")s.push(i.shift());t=i.join("\n"),r.push.apply(r,this.processBlock(s.join("\n"),[]))}while(n.length&&n[0][0]==">"){var o=n.shift();t=new String(t+t.trailing+o),t.trailing=o.trailing}var u=t.replace(/^> ?/gm,""),a=this.tree;return r.push(this.toTree(u,["blockquote"])),r},referenceDefn:function(t,n){var r=/^\s*\[(.*?)\]:\s*(\S+)(?:\s+(?:(['"])(.*?)\3|\((.*?)\)))?\n?/;if(!t.match(r))return undefined;h(this.tree)||this.tree.splice(1,0,{});var i=h(this.tree);i.references===undefined&&(i.references={});var o=this.loop_re_over_block(r,t,function(e){e[2]&&e[2][0]=="<"&&e[2][e[2].length-1]==">"&&(e[2]=e[2].substring(1,e[2].length-1));var t=i.references[e[1].toLowerCase()]={href:e[2]};e[4]!==undefined?t.title=e[4]:e[5]!==undefined&&(t.title=e[5])});return o.length&&n.unshift(s(o,t.trailing)),[]},para:function(t,n){return[["para"].concat(this.processInline(t))]}}},n.dialects.Gruber.inline={__oneElement__:function(t,n,r){var i,s,o=0;n=n||this.dialect.inline.__patterns__;var u=new RegExp("([\\s\\S]*?)("+(n.source||n)+")");i=u.exec(t);if(!i)return[t.length,t];if(i[1])return[i[1].length,i[1]];var s;return i[2]in this.dialect.inline&&(s=this.dialect.inline[i[2]].call(this,t.substr(i.index),i,r||[])),s=s||[i[2].length,i[2]],s},__call__:function(t,n){function s(e){typeof e=="string"&&typeof r[r.length-1]=="string"?r[r.length-1]+=e:r.push(e)}var r=[],i;while(t.length>0)i=this.dialect.inline.__oneElement__.call(this,t,n,r),t=t.substr(i.shift()),c(i,s);return r},"]":function(){},"}":function(){},"\\":function(t){return t.match(/^\\[\\`\*_{}\[\]()#\+.!\-]/)?[2,t[1]]:[1,"\\"]},"![":function(t){var n=t.match(/^!\[(.*?)\][ \t]*\([ \t]*(\S*)(?:[ \t]+(["'])(.*?)\3)?[ \t]*\)/);if(n){n[2]&&n[2][0]=="<"&&n[2][n[2].length-1]==">"&&(n[2]=n[2].substring(1,n[2].length-1)),n[2]=this.dialect.inline.__call__.call(this,n[2],/\\/)[0];var r={alt:n[1],href:n[2]||""};return n[4]!==undefined&&(r.title=n[4]),[n[0].length,["img",r]]}return n=t.match(/^!\[(.*?)\][ \t]*\[(.*?)\]/),n?[n[0].length,["img_ref",{alt:n[1],ref:n[2].toLowerCase(),original:n[0]}]]:[2,"!["]},"[":function b(e){var t=String(e),r=n.DialectHelpers.inline_until_char.call(this,e.substr(1),"]");if(!r)return[1,"["];var i=1+r[0],s=r[1],b,o;e=e.substr(i);var u=e.match(/^\s*\([ \t]*(\S+)(?:[ \t]+(["'])(.*?)\2)?[ \t]*\)/);if(u){var a=u[1];i+=u[0].length,a&&a[0]=="<"&&a[a.length-1]==">"&&(a=a.substring(1,a.length-1));if(!u[3]){var f=1;for(var l=0;l<a.length;l++)switch(a[l]){case"(":f++;break;case")":--f==0&&(i-=a.length-l,a=a.substring(0,l))}}return a=this.dialect.inline.__call__.call(this,a,/\\/)[0],o={href:a||""},u[3]!==undefined&&(o.title=u[3]),b=["link",o].concat(s),[i,b]}return u=e.match(/^\s*\[(.*?)\]/),u?(i+=u[0].length,o={ref:(u[1]||String(s)).toLowerCase(),original:t.substr(0,i)},b=["link_ref",o].concat(s),[i,b]):s.length==1&&typeof s[0]=="string"?(o={ref:s[0].toLowerCase(),original:t.substr(0,i)},b=["link_ref",o,s[0]],[i,b]):[1,"["]},"<":function(t){var n;return(n=t.match(/^<(?:((https?|ftp|mailto):[^>]+)|(.*?@.*?\.[a-zA-Z]+))>/))!=null?n[3]?[n[0].length,["link",{href:"mailto:"+n[3]},n[3]]]:n[2]=="mailto"?[n[0].length,["link",{href:n[1]},n[1].substr("mailto:".length)]]:[n[0].length,["link",{href:n[1]},n[1]]]:[1,"<"]},"`":function(t){var n=t.match(/(`+)(([\s\S]*?)\1)/);return n&&n[2]?[n[1].length+n[2].length,["inlinecode",n[3]]]:[1,"`"]}," \n":function(t){return[3,["linebreak"]]}},n.dialects.Gruber.inline["**"]=u("strong","**"),n.dialects.Gruber.inline.__=u("strong","__"),n.dialects.Gruber.inline["*"]=u("em","*"),n.dialects.Gruber.inline._=u("em","_"),n.buildBlockOrder=function(e){var t=[];for(var n in e){if(n=="__order__"||n=="__call__")continue;t.push(n)}e.__order__=t},n.buildInlinePatterns=function(e){var t=[];for(var n in e){if(n.match(/^__.*__$/))continue;var r=n.replace(/([\\.*+?|()\[\]{}])/g,"\\$1").replace(/\n/,"\\n");t.push(n.length==1?r:"(?:"+r+")")}t=t.join("|"),e.__patterns__=t;var i=e.__call__;e.__call__=function(e,n){return n!=undefined?i.call(this,e,n):i.call(this,e,t)}},n.DialectHelpers={},n.DialectHelpers.inline_until_char=function(e,t){var n=0,r=[];for(;;){if(e[n]==t)return n++,[n,r];if(n>=e.length)return null;res=this.dialect.inline.__oneElement__.call(this,e.substr(n)),n+=res[0],r.push.apply(r,res.slice(1))}},n.subclassDialect=function(e){function t(){}function n(){}return t.prototype=e.block,n.prototype=e.inline,{block:new t,inline:new n}},n.buildBlockOrder(n.dialects.Gruber.block),n.buildInlinePatterns(n.dialects.Gruber.inline),n.dialects.Maruku=n.subclassDialect(n.dialects.Gruber),n.dialects.Maruku.processMetaHash=function(t){var n=f(t),r={};for(var i=0;i<n.length;++i)if(/^#/.test(n[i]))r.id=n[i].substring(1);else if(/^\./.test(n[i]))r["class"]?r["class"]=r["class"]+n[i].replace(/./," "):r["class"]=n[i].substring(1);else if(/\=/.test(n[i])){var s=n[i].split(/\=/);r[s[0]]=s[1]}return r},n.dialects.Maruku.block.document_meta=function(t,n){if(t.lineNumber>1)return undefined;if(!t.match(/^(?:\w+:.*\n)*\w+:.*$/))return undefined;h(this.tree)||this.tree.splice(1,0,{});var r=t.split(/\n/);for(p in r){var i=r[p].match(/(\w+):\s*(.*)$/),s=i[1].toLowerCase(),o=i[2];this.tree[1][s]=o}return[]},n.dialects.Maruku.block.block_meta=function(t,n){var r=t.match(/(^|\n) {0,3}\{:\s*((?:\\\}|[^\}])*)\s*\}$/);if(!r)return undefined;var i=this.dialect.processMetaHash(r[2]),s;if(r[1]===""){var o=this.tree[this.tree.length-1];s=h(o);if(typeof o=="string")return undefined;s||(s={},o.splice(1,0,s));for(a in i)s[a]=i[a];return[]}var u=t.replace(/\n.*$/,""),f=this.processBlock(u,[]);s=h(f[0]),s||(s={},f[0].splice(1,0,s));for(a in i)s[a]=i[a];return f},n.dialects.Maruku.block.definition_list=function(t,n){var r=/^((?:[^\s:].*\n)+):\s+([\s\S]+)$/,i=["dl"],s;if(!(a=t.match(r)))return undefined;var o=[t];while(n.length&&r.exec(n[0]))o.push(n.shift());for(var u=0;u<o.length;++u){var a=o[u].match(r),f=a[1].replace(/\n$/,"").split(/\n/),l=a[2].split(/\n:\s+/);for(s=0;s<f.length;++s)i.push(["dt",f[s]]);for(s=0;s<l.length;++s)i.push(["dd"].concat(this.processInline(l[s].replace(/(\n)\s+/,"$1"))))}return[i]},n.dialects.Maruku.inline["{:"]=function(t,n,r){if(!r.length)return[2,"{:"];var i=r[r.length-1];if(typeof i=="string")return[2,"{:"];var s=t.match(/^\{:\s*((?:\\\}|[^\}])*)\s*\}/);if(!s)return[2,"{:"];var o=this.dialect.processMetaHash(s[1]),u=h(i);u||(u={},i.splice(1,0,u));for(var a in o)u[a]=o[a];return[s[0].length,""]},n.buildBlockOrder(n.dialects.Maruku.block),n.buildInlinePatterns(n.dialects.Maruku.inline);var l=Array.isArray||function(e){return Object.prototype.toString.call(e)=="[object Array]"},c;Array.prototype.forEach?c=function(e,t,n){return e.forEach(t,n)}:c=function(e,t,n){for(var r=0;r<e.length;r++)t.call(n||e,e[r],r,e)},t.renderJsonML=function(e,t){t=t||{},t.root=t.root||!1;var n=[];if(t.root)n.push(v(e));else{e.shift(),e.length&&typeof e[0]=="object"&&!(e[0]instanceof Array)&&e.shift();while(e.length)n.push(v(e.shift()))}return n.join("\n\n")}})(function(){return typeof n=="undefined"?(window.markdown={},window.markdown):n}())}),e.define("util",function(e,t,n,r,i,s,o){function a(e){return e instanceof Array||Array.isArray(e)||e&&e!==Object.prototype&&a(e.__proto__)}function f(e){return e instanceof RegExp||typeof e=="object"&&Object.prototype.toString.call(e)==="[object RegExp]"}function l(e){if(e instanceof Date)return!0;if(typeof e!="object")return!1;var t=Date.prototype&&v(Date.prototype),n=e.__proto__&&v(e.__proto__);return JSON.stringify(n)===JSON.stringify(t)}function c(e){return e<10?"0"+e.toString(10):e.toString(10)}function p(){var e=new Date,t=[c(e.getHours()),c(e.getMinutes()),c(e.getSeconds())].join(":");return[e.getDate(),h[e.getMonth()],t].join(" ")}var u=e("events");n.isArray=a,n.isDate=function(e){return Object.prototype.toString.call(e)==="[object Date]"},n.isRegExp=function(e){return Object.prototype.toString.call(e)==="[object RegExp]"},n.print=function(){},n.puts=function(){},n.debug=function(){},n.inspect=function(e,t,r,i){function u(e,r){if(e&&typeof e.inspect=="function"&&e!==n&&(!e.constructor||e.constructor.prototype!==e))return e.inspect(r);switch(typeof e){case"undefined":return o("undefined","undefined");case"string":var i="'"+JSON.stringify(e).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return o(i,"string");case"number":return o(""+e,"number");case"boolean":return o(""+e,"boolean")}if(e===null)return o("null","null");var c=d(e),h=t?v(e):c;if(typeof e=="function"&&h.length===0){if(f(e))return o(""+e,"regexp");var p=e.name?": "+e.name:"";return o("[Function"+p+"]","special")}if(l(e)&&h.length===0)return o(e.toUTCString(),"date");var m,g,y;a(e)?(g="Array",y=["[","]"]):(g="Object",y=["{","}"]);if(typeof e=="function"){var b=e.name?": "+e.name:"";m=f(e)?" "+e:" [Function"+b+"]"}else m="";l(e)&&(m=" "+e.toUTCString());if(h.length===0)return y[0]+m+y[1];if(r<0)return f(e)?o(""+e,"regexp"):o("[Object]","special");s.push(e);var w=h.map(function(t){var n,i;e.__lookupGetter__&&(e.__lookupGetter__(t)?e.__lookupSetter__(t)?i=o("[Getter/Setter]","special"):i=o("[Getter]","special"):e.__lookupSetter__(t)&&(i=o("[Setter]","special"))),c.indexOf(t)<0&&(n="["+t+"]"),i||(s.indexOf(e[t])<0?(r===null?i=u(e[t]):i=u(e[t],r-1),i.indexOf("\n")>-1&&(a(e)?i=i.split("\n").map(function(e){return" "+e}).join("\n").substr(2):i="\n"+i.split("\n").map(function(e){return" "+e}).join("\n"))):i=o("[Circular]","special"));if(typeof n=="undefined"){if(g==="Array"&&t.match(/^\d+$/))return i;n=JSON.stringify(""+t),n.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(n=n.substr(1,n.length-2),n=o(n,"name")):(n=n.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),n=o(n,"string"))}return n+": "+i});s.pop();var E=0,S=w.reduce(function(e,t){return E++,t.indexOf("\n")>=0&&E++,e+t.length+1},0);return S>50?w=y[0]+(m===""?"":m+"\n ")+" "+w.join(",\n ")+" "+y[1]:w=y[0]+m+" "+w.join(", ")+" "+y[1],w}var s=[],o=function(e,t){var n={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},r={special:"cyan",number:"blue","boolean":"yellow","undefined":"grey","null":"bold",string:"green",date:"magenta",regexp:"red"}[t];return r?"["+n[r][0]+"m"+e+"["+n[r][1]+"m":e};return i||(o=function(e,t){return e}),u(e,typeof r=="undefined"?2:r)};var h=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];n.log=function(e){},n.pump=null;var d=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t},v=Object.getOwnPropertyNames||function(e){var t=[];for(var n in e)Object.hasOwnProperty.call(e,n)&&t.push(n);return t},m=Object.create||function(e,t){var n;if(e===null)n={__proto__:null};else{if(typeof e!="object")throw new TypeError("typeof prototype["+typeof e+"] != 'object'");var r=function(){};r.prototype=e,n=new r,n.__proto__=e}return typeof t!="undefined"&&Object.defineProperties&&Object.defineProperties(n,t),n};n.inherits=function(e,t){e.super_=t,e.prototype=m(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})};var g=/%[sdj%]/g;n.format=function(e){if(typeof e!="string"){var t=[];for(var r=0;r<arguments.length;r++)t.push(n.inspect(arguments[r]));return t.join(" ")}var r=1,i=arguments,s=i.length,o=String(e).replace(g,function(e){if(e==="%%")return"%";if(r>=s)return e;switch(e){case"%s":return String(i[r++]);case"%d":return Number(i[r++]);case"%j":return JSON.stringify(i[r++]);default:return e}});for(var u=i[r];r<s;u=i[++r])u===null||typeof u!="object"?o+=" "+u:o+=" "+n.inspect(u);return o}}),e.define("events",function(e,t,n,r,i,s,o){function f(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0;n<e.length;n++)if(t===e[n])return n;return-1}s.EventEmitter||(s.EventEmitter=function(){});var u=n.EventEmitter=s.EventEmitter,a=typeof Array.isArray=="function"?Array.isArray:function(e){return Object.prototype.toString.call(e)==="[object Array]"},l=10;u.prototype.setMaxListeners=function(e){this._events||(this._events={}),this._events.maxListeners=e},u.prototype.emit=function(e){if(e==="error")if(!this._events||!this._events.error||a(this._events.error)&&!this._events.error.length)throw arguments[1]instanceof Error?arguments[1]:new Error("Uncaught, unspecified 'error' event.");if(!this._events)return!1;var t=this._events[e];if(!t)return!1;if(typeof t=="function"){switch(arguments.length){case 1:t.call(this);break;case 2:t.call(this,arguments[1]);break;case 3:t.call(this,arguments[1],arguments[2]);break;default:var n=Array.prototype.slice.call(arguments,1);t.apply(this,n)}return!0}if(a(t)){var n=Array.prototype.slice.call(arguments,1),r=t.slice();for(var i=0,s=r.length;i<s;i++)r[i].apply(this,n);return!0}return!1},u.prototype.addListener=function(e,t){if("function"!=typeof t)throw new Error("addListener only takes instances of Function");this._events||(this._events={}),this.emit("newListener",e,t);if(!this._events[e])this._events[e]=t;else if(a(this._events[e])){if(!this._events[e].warned){var n;this._events.maxListeners!==undefined?n=this._events.maxListeners:n=l,n&&n>0&&this._events[e].length>n&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),console.trace())}this._events[e].push(t)}else this._events[e]=[this._events[e],t];return this},u.prototype.on=u.prototype.addListener,u.prototype.once=function(e,t){var n=this;return n.on(e,function r(){n.removeListener(e,r),t.apply(this,arguments)}),this},u.prototype.removeListener=function(e,t){if("function"!=typeof t)throw new Error("removeListener only takes instances of Function");if(!this._events||!this._events[e])return this;var n=this._events[e];if(a(n)){var r=f(n,t);if(r<0)return this;n.splice(r,1),n.length==0&&delete this._events[e]}else this._events[e]===t&&delete this._events[e];return this},u.prototype.removeAllListeners=function(e){return e&&this._events&&this._events[e]&&(this._events[e]=null),this},u.prototype.listeners=function(e){return this._events||(this._events={}),this._events[e]||(this._events[e]=[]),a(this._events[e])||(this._events[e]=[this._events[e]]),this._events[e]}}),e.define("/src/js/dialogs/nextLevel.js",function(e,t,n,r,i,s,o){n.dialog={en_US:[{type:"ModalAlert",options:{markdowns:["## Great Job!!","","You solved the level in *{numCommands}* command(s); ","our solution uses {best}."]}}],zh_CN:[{type:"ModalAlert",options:{markdowns:["## ",""," *{numCommands}* {best}"]}}]}}),e.define("/src/js/models/commandModel.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../util/errors"),l=e("../git/commands"),c=l.GitOptionParser,h=e("../level/parseWaterfall").ParseWaterfall,p=f.CommandProcessError,d=f.GitError,v=f.Warning,m=f.CommandResult,g=a.Model.extend({defaults:{status:"inqueue",rawStr:null,result:"",createTime:null,error:null,warnings:null,parseWaterfall:new h,generalArgs:null,supportedMap:null,options:null,method:null},initialize:function(e){this.initDefaults(),this.validateAtInit(),this.on("change:error",this.errorChanged,this),this.get("error")&&this.errorChanged(),this.parseOrCatch()},initDefaults:function(){this.set("generalArgs",[]),this.set("supportedMap",{}),this.set("warnings",[])},validateAtInit:function(){if(this.get("rawStr")===null)throw new Error("Give me a string!");this.get("createTime")||this.set("createTime",(new Date).toString())},setResult:function(e){this.set("result",e)},finishWith:function(e){this.set("status","finished"),e.resolve()},addWarning:function(e){this.get("warnings").push(e),this.set("numWarnings",this.get("numWarnings")?this.get("numWarnings")+1:1)},getFormattedWarnings:function(){if(!this.get("warnings").length)return"";var e='<i class="icon-exclamation-sign"></i>';return"<p>"+e+this.get("warnings").join("</p><p>"+e)+"</p>"},parseOrCatch:function(){this.expandShortcuts(this.get("rawStr"));try{this.processInstants()}catch(e){f.filterError(e),this.set("error",e);return}if(this.parseAll())return;this.set("error",new p({msg:'The command "'+this.get("rawStr")+"\" isn't supported, sorry!"}))},errorChanged:function(){var e=this.get("error");e instanceof p||e instanceof d?this.set("status","error"):e instanceof m?this.set("status","finished"):e instanceof v&&this.set("status","warning"),this.formatError()},formatError:function(){this.set("result",this.get("error").toResult())},expandShortcuts:function(e){e=this.get("parseWaterfall").expandAllShortcuts(e),this.set("rawStr",e)},processInstants:function(){var e=this.get("rawStr");if(!e.length)throw new m({msg:""});this.get("parseWaterfall").processAllInstants(e)},parseAll:function(){var e=this.get("rawStr"),t=this.get("parseWaterfall").parseAll(e);return t?(u.each(t.toSet,function(e,t){this.set(t,e)},this),!0):!1}}),y=a.Model.extend({defaults:{text:""}});n.CommandEntry=y,n.Command=g}),e.define("/src/js/git/commands.js",function(e,t,n,r,i,s,o){function y(e,t){this.method=e,this.rawOptions=t,this.supportedMap=this.getMasterOptionMap()[e];if(this.supportedMap===undefined)throw new Error("No option map for "+e);this.generalArgs=[],this.explodeAndSet()}var u=e("underscore"),a=e("../intl"),f=e("../util/errors"),l=f.CommandProcessError,c=f.GitError,h=f.Warning,p=f.CommandResult,d={"git commit":/^(gc|git ci)($|\s)/,"git add":/^ga($|\s)/,"git checkout":/^(go|git co)($|\s)/,"git rebase":/^gr($|\s)/,"git branch":/^(gb|git br)($|\s)/,"git status":/^(gst|gs|git st)($|\s)/,"git help":/^git$/},v=[[/^git help($|\s)/,function(){var e=[a.str("git-version"),"<br/>",a.str("git-usage"),u.escape(a.str("git-usage-command")),"<br/>",a.str("git-supported-commands"),"<br/>"],t=y.prototype.getMasterOptionMap();u.each(t,function(t,n){e.push("git "+n),u.each(t,function(t,n){e.push(" "+n)},this)},this);var n=e.join("\n");throw n=n.replace(/\t/g,"&nbsp;&nbsp;&nbsp;"),new p({msg:n})}]],m={"git commit":/^git +commit($|\s)/,"git add":/^git +add($|\s)/,"git checkout":/^git +checkout($|\s)/,"git rebase":/^git +rebase($|\s)/,"git reset":/^git +reset($|\s)/,"git branch":/^git +branch($|\s)/,"git revert":/^git +revert($|\s)/,"git log":/^git +log($|\s)/,"git merge":/^git +merge($|\s)/,"git show":/^git +show($|\s)/,"git status":/^git +status($|\s)/,"git cherry-pick":/^git +cherry-pick($|\s)/},g=function(e){var t,n;u.each(m,function(r,i){r.exec(e)&&(n=e.slice(i.length+1),t=i.slice("git ".length))});if(!t)return!1;var r=new y(t,n);return{toSet:{generalArgs:r.generalArgs,supportedMap:r.supportedMap,method:t,options:n,eventName:"processGitCommand"}}};y.prototype.getMasterOptionMap=function(){return{commit:{"--amend":!1,"-a":!1,"-am":!1,"-m":!1},status:{},log:{},add:{},"cherry-pick":{},branch:{"-d":!1,"-D":!1,"-f":!1,"--contains":!1},checkout:{"-b":!1,"-B":!1,"-":!1},reset:{"--hard":!1,"--soft":!1},merge:{},rebase:{"-i":!1},revert:{},show:{}}},y.prototype.explodeAndSet=function(){var e=this.rawOptions.match(/('.*?'|".*?"|\S+)/g)||[];for(var t=0;t<e.length;t++){var n=e[t];if(n.slice(0,1)=="-"){if(this.supportedMap[n]===undefined)throw new l({msg:a.str("option-not-supported",{option:n})});var r=[],i=t+1;while(i<e.length&&e[i].slice(0,1)!="-")r.push(e[i]),i+=1;t=i-1,this.supportedMap[n]=r}else this.generalArgs.push(n)}},n.shortcutMap=d,n.instantCommands=v,n.parse=g,n.regexMap=m}),e.define("/src/js/level/parseWaterfall.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../git/commands"),f=e("../level/sandboxCommands"),l=function(e){e=e||{},this.options=e,this.shortcutWaterfall=e.shortcutWaterfall||[a.shortcutMap],this.instantWaterfall=e.instantWaterfall||[a.instantCommands,f.instantCommands]};l.prototype.initParseWaterfall=function(){if(!e("../util").isBrowser()){this.parseWaterfall=[a.parse];return}this.parseWaterfall=this.options.parseWaterfall||[a.parse,f.parse,f.getOptimisticLevelParse(),f.getOptimisticLevelBuilderParse()]},l.prototype.clone=function(){return new l({shortcutWaterfall:this.shortcutWaterfall.slice(),instantWaterfall:this.instantWaterfall.slice(),parseWaterfall:this.parseWaterfall.slice()})},l.prototype.getWaterfallMap=function(){return this.parseWaterfall||this.initParseWaterfall(),{shortcutWaterfall:this.shortcutWaterfall,instantWaterfall:this.instantWaterfall,parseWaterfall:this.parseWaterfall}},l.prototype.addFirst=function(e,t){if(!e||!t)throw new Error("need to know which!!!");this.getWaterfallMap()[e].unshift(t)},l.prototype.addLast=function(e,t){this.getWaterfallMap()[e].push(t)},l.prototype.expandAllShortcuts=function(e){return u.each(this.shortcutWaterfall,function(t){e=this.expandShortcut(e,t)},this),e},l.prototype.expandShortcut=function(e,t){return u.each(t,function(t,n){var r=t.exec(e);r&&(e=n+" "+e.slice(r[0].length))}),e},l.prototype.processAllInstants=function(e){u.each(this.instantWaterfall,function(t){this.processInstant(e,t)},this)},l.prototype.processInstant=function(e,t){u.each(t,function(t){var n=t[0],r=n.exec(e);r&&t[1](r)})},l.prototype.parseAll=function(e){this.parseWaterfall||this.initParseWaterfall();var t=!1;return u.each(this.parseWaterfall,function(n){var r=n(e);r&&(t=r)},this),t},n.ParseWaterfall=l}),e.define("/src/js/level/sandboxCommands.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util"),f=e("../util/constants"),l=e("../intl"),c=e("../util/errors"),h=c.CommandProcessError,p=c.GitError,d=c.Warning,v=c.CommandResult,m=[[/^ls/,function(){throw new v({msg:l.str("ls-command")})}],[/^cd/,function(){throw new v({msg:l.str("cd-command")})}],[/^(locale|locale reset)$/,function(t){f.GLOBAL.locale=l.getDefaultLocale();var n=e("../app").getEvents().trigger("localeChanged");throw new v({msg:l.str("locale-reset-command",{locale:l.getDefaultLocale()})})}],[/^show$/,function(e){var t=[l.str("show-command"),"<br/>","show commands","show solution","show goal"];throw new v({msg:t.join("\n")})}],[/^locale (\w+)$/,function(t){f.GLOBAL.locale=t[1];var n=e("../app").getEvents().trigger("localeChanged");throw new v({msg:l.str("locale-command",{locale:t[1]})})}],[/^refresh$/,function(){var t=e("../app").getEvents();throw t.trigger("refreshTree"),new v({msg:l.str("refresh-tree-command")})}],[/^rollup (\d+)$/,function(t){var n=e("../app").getEvents();throw n.trigger("rollupCommands",t[1]),new v({msg:"Commands combined!"})}],[/^echo "(.*?)"$|^echo (.*?)$/,function(e){var t=e[1]||e[2];throw new v({msg:t})}],[/^show +commands$/,function(e){var t=y(),n=[l.str("show-all-commands"),"<br/>"];throw u.each(t,function(e,t){n.push(t)}),new v({msg:n.join("\n")})}]],g={"reset solved":/^reset solved($|\s)/,help:/^help( +general)?$|^\?$/,reset:/^reset( +--forSolution)?$/,delay:/^delay (\d+)$/,clear:/^clear($|\s)/,"exit level":/^exit level($|\s)/,sandbox:/^sandbox($|\s)/,level:/^level\s?([a-zA-Z0-9]*)/,levels:/^levels($|\s)/,mobileAlert:/^mobile alert($|\s)/,"build level":/^build +level($|\s)/,"export tree":/^export +tree$/,"import tree":/^import +tree$/,"import level":/^import +level$/,undo:/^undo($|\s)/},y=function(){var t=["mobileAlert"],n=u.extend({},e("../git/commands").regexMap,e("../level").regexMap,g);return u.each(t,function(e){delete n[e]}),n};n.instantCommands=m,n.parse=a.genParseCommand(g,"processSandboxCommand"),n.getOptimisticLevelParse=function(){return a.genParseCommand(e("../level").regexMap,"processLevelCommand")},n.getOptimisticLevelBuilderParse=function(){return a.genParseCommand(e("../level/builder").regexMap,"processLevelBuilderCommand")}}),e.define("/src/js/level/builder.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("q"),l=e("../util"),c=e("../app"),h=e("../intl"),p=e("../util/errors"),d=e("../visuals/visualization").Visualization,v=e("../level/parseWaterfall").ParseWaterfall,m=e("../level").Level,g=e("../models/commandModel").Command,y=e("../git/gitShim").GitShim,b=e("../views/multiView").MultiView,w=e("../views").CanvasTerminalHolder,E=e("../views").ConfirmCancelTerminal,S=e("../views").NextLevelConfirm,x=e("../views").LevelToolbar,T=e("../views/builderViews").MarkdownPresenter,N=e("../views/builderViews").MultiViewBuilder,C=e("../views/builderViews").MarkdownGrabber,k={"define goal":/^define goal$/,"define name":/^define name$/,"help builder":/^help builder$/,"define start":/^define start$/,"edit dialog":/^edit dialog$/,"show start":/^show start$/,"hide start":/^hide start$/,"define hint":/^define hint$/,finish:/^finish$/},L=l.genParseCommand(k,"processLevelBuilderCommand"),A=m.extend({initialize:function(t){t=t||{},t.level=t.level||{};var n=h.getLocale();t.level.startDialog={},t.level.startDialog[n]={childViews:h.getDialog(e("../dialogs/levelBuilder"))},A.__super__.initialize.apply(this,[t]),this.startDialogObj=undefined,this.definedGoal=!1,delete this.treeCompare,delete this.solved},initName:function(){this.levelToolbar=new x({name:h.str("level-builder")})},initGoalData:function(){this.level.goalTreeString='{"branches":{"master":{"target":"C1","id":"master"},"makeLevel":{"target":"C2","id":"makeLevel"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"makeLevel","id":"HEAD"}}',this.level.solutionCommand="git checkout -b makeLevel; git commit",A.__super__.initGoalData.apply(this,arguments)},initStartVisualization:function(){return this.startCanvasHolder=new w({additionalClass:"startTree",text:h.str("hide-start")}),this.startVis=new d({el:this.startCanvasHolder.getCanvasLocation(),containerElement:this.startCanvasHolder.getCanvasLocation(),treeString:this.level.startTree,noKeyboardInput:!0,noClick:!0}),this.startCanvasHolder},startOffCommand:function(){c.getEventBaton().trigger("commandSubmitted","echo :D")},objectiveDialog:function(e,t){var n=[e,t,this.startDialogObj===undefined?null:{startDialog:{en_US:this.startDialogObj}}];A.__super__.objectiveDialog.apply(this,n)},initParseWaterfall:function(e){A.__super__.initParseWaterfall.apply(this,[e]),this.parseWaterfall.addFirst("parseWaterfall",L),this.parseWaterfall.addFirst("instantWaterfall",this.getInstantCommands())},buildLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().buildLevel(e,t)},this.getAnimationTime()*1.5)},getInstantCommands:function(){return[[/^help$|^\?$/,function(){throw new p.CommandResult({msg:h.str("help-vague-builder")})}]]},takeControl:function(){c.getEventBaton().stealBaton("processLevelBuilderCommand",this.processLevelBuilderCommand,this),A.__super__.takeControl.apply(this)},releaseControl:function(){c.getEventBaton().releaseBaton("processLevelBuilderCommand",this.processLevelBuilderCommand,this),A.__super__.releaseControl.apply(this)},showGoal:function(){this.hideStart(),A.__super__.showGoal.apply(this,arguments)},showStart:function(e,t){this.hideGoal(),this.showSideVis(e,t,this.startCanvasHolder,this.initStartVisualization)},resetSolution:function(){this.gitCommandsIssued=[],this.level.solutionCommand=undefined},hideStart:function(e,t){this.hideSideVis(e,t,this.startCanvasHolder)},defineStart:function(e,t){this.hideStart(),e.addWarning(h.str("define-start-warning")),this.resetSolution(),this.level.startTree=this.mainVis.gitEngine.printTree(),this.mainVis.resetFromThisTreeNow(this.level.startTree),this.showStart(e,t)},defineGoal:function(e,t){this.hideGoal();if(!this.gitCommandsIssued.length){e.set("error",new p.GitError({msg:h.str("solution-empty")})),t.resolve();return}this.definedGoal=!0,this.level.solutionCommand=this.gitCommandsIssued.join(";"),this.level.goalTreeString=this.mainVis.gitEngine.printTree(),this.initGoalVisualization(),this.showGoal(e,t)},defineName:function(e,t){this.level.name={en_US:prompt(h.str("prompt-name"))},e&&e.finishWith(t)},defineHint:function(e,t){this.level.hint={en_US:prompt(h.str("prompt-hint"))},e&&e.finishWith(t)},editDialog:function(e,t){var n=f.defer();this.currentBuilder=new N({multiViewJSON:this.startDialogObj,deferred:n}),n.promise.then(u.bind(function(e){this.startDialogObj=e},this)).fail(function(){}).done(function(){e?e.finishWith(t):t.resolve()})},finish:function(e,t){if(!this.gitCommandsIssued.length||!this.definedGoal){e.set("error",new p.GitError({msg:h.str("solution-empty")})),t.resolve();return}while(!this.level.name)this.defineName();var n=f.defer(),r=n.promise;if(this.level.hint===undefined){var i=f.defer();r=r.then(function(){return i.promise});var s=new E({markdowns:[h.str("want-hint")]});s.getPromise().then(u.bind(this.defineHint,this)).fail(u.bind(function(){this.level.hint={en_US:""}},this)).done(function(){i.resolve()})}if(this.startDialogObj===undefined){var o=f.defer();r=r.then(function(){return o.promise});var a=new E({markdowns:[h.str("want-start-dialog")]});a.getPromise().then(u.bind(function(){var e=f.defer();return this.editDialog(undefined,e),e.promise},this)).fail(function(){}).done(function(){o.resolve()})}r=r.done(u.bind(function(){new T({fillerText:JSON.stringify(this.getExportObj(),null,2),previewText:h.str("share-json")}),e.finishWith(t)},this)),n.resolve()},getExportObj:function(){var e=u.extend({},this.level);return delete e.startDialog,this.startDialogObj&&(e.startDialog={en_US:this.startDialogObj}),e},processLevelBuilderCommand:function(e,t){var n={"define goal":this.defineGoal,"define start":this.defineStart,"show start":this.showStart,"hide start":this.hideStart,finish:this.finish,"define hint":this.defineHint,"define name":this.defineName,"edit dialog":this.editDialog,"help builder":A.__super__.startDialog};if(!n[e.get("method")])throw new Error("woah we dont support that method yet");n[e.get("method")].apply(this,arguments)},afterCommandDefer:function(e,t){e.resolve()},die:function(){this.hideStart(),A.__super__.die.apply(this,arguments),delete this.startVis,delete this.startCanvasHolder}});n.LevelBuilder=A,n.regexMap=k}),e.define("/src/js/git/gitShim.js",function(e,t,n,r,i,s,o){function c(e){e=e||{},this.beforeCB=e.beforeCB||function(){},this.afterCB=e.afterCB||function(){};var t=function(e){e.resolve()};this.beforeDeferHandler=e.beforeDeferHandler||t,this.afterDeferHandler=e.afterDeferHandler||t,this.eventBaton=e.eventBaton||f.getEventBaton()}var u=e("underscore"),a=e("q"),f=e("../app"),l=e("../views/multiView").MultiView;c.prototype.insertShim=function(){this.eventBaton.stealBaton("processGitCommand",this.processGitCommand,this)},c.prototype.removeShim=function(){this.eventBaton.releaseBaton("processGitCommand",this.processGitCommand,this)},c.prototype.processGitCommand=function(e,t){this.beforeCB(e);var n=a.defer();n.promise.then(u.bind(function(){this.afterGitCommandProcessed(e,t)},this)).done();var r=u.bind(function(){this.eventBaton.passBatonBack("processGitCommand",this.processGitCommand,this,[e,n])},this),i=a.defer();i.promise.then(r).done(),this.beforeDeferHandler(i,e)},c.prototype.afterGitCommandProcessed=function(e,t){this.afterCB(e);var n=a.defer();n.promise.then(function(){t.resolve()}).done(),this.afterDeferHandler(n,e)},n.GitShim=c}),e.define("/src/js/views/multiView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../views").ModalTerminal,c=e("../views").ContainedBase,h=e("../views").ConfirmCancelView,p=e("../views").LeftRightView,d=e("../views").ModalAlert,v=e("../views/gitDemonstrationView").GitDemonstrationView,m=e("../views/builderViews"),g=m.MarkdownPresenter,y=e("../util/keyboard").KeyboardListener,b=e("../util/errors").GitError,w=f.View.extend({tagName:"div",className:"multiView",navEventDebounce:550,deathTime:700,typeToConstructor:{ModalAlert:d,GitDemonstrationView:v,MarkdownPresenter:g},initialize:function(e){e=e||{},this.childViewJSONs=e.childViews||[{type:"ModalAlert",options:{markdown:"Woah wtf!!"}},{type:"GitDemonstrationView",options:{command:"git checkout -b side; git commit; git commit"}},{type:"ModalAlert",options:{markdown:"Im second"}}],this.deferred=e.deferred||a.defer(),this.childViews=[],this.currentIndex=0,this.navEvents=u.clone(f.Events),this.navEvents.on("negative",this.getNegFunc(),this),this.navEvents.on("positive",this.getPosFunc(),this),this.navEvents.on("quit",this.finish,this),this.keyboardListener=new y({events:this.navEvents,aliasMap:{left:"negative",right:"positive",enter:"positive",esc:"quit"}}),this.render(),e.wait||this.start()},onWindowFocus:function(){},getAnimationTime:function(){return 700},getPromise:function(){return this.deferred.promise},getPosFunc:function(){return u.debounce(u.bind(function(){this.navForward()},this),this.navEventDebounce,!0)},getNegFunc:function(){return u.debounce(u.bind(function(){this.navBackward()},this),this.navEventDebounce,!0)},lock:function(){this.locked=!0},unlock:function(){this.locked=!1},navForward:function(){if(this.locked)return;if(this.currentIndex===this.childViews.length-1){this.hideViewIndex(this.currentIndex),this.finish();return}this.navIndexChange(1)},navBackward:function(){if(this.currentIndex===0)return;this.navIndexChange(-1)},navIndexChange:function(e){this.hideViewIndex(this.currentIndex),this.currentIndex+=e,this.showViewIndex(this.currentIndex)},hideViewIndex:function(e){this.childViews[e].hide()},showViewIndex:function(e){this.childViews[e].show()},finish:function(){this.keyboardListener.mute(),u.each(this.childViews,function(e){e.die()}),this.deferred.resolve()},start:function(){this.showViewIndex(this.currentIndex)},createChildView:function(e){var t=e.type;if(!this.typeToConstructor[t])throw new Error('no constructor for type "'+t+'"');var n=new this.typeToConstructor[t](u.extend({},e.options,{wait:!0}));return n},addNavToView:function(e,t){var n=new p({events:this.navEvents,destination:e.getDestination(),showLeft:t!==0,lastNav:t===this.childViewJSONs.length-1});e.receiveMetaNav&&e.receiveMetaNav(n,this)},render:function(){u.each(this.childViewJSONs,function(e,t){var n=this.createChildView(e);this.childViews.push(n),this.addNavToView(n,t)},this)}});n.MultiView=w}),e.define("/src/js/views/gitDemonstrationView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../util/keyboard").KeyboardListener,h=e("../models/commandModel").Command,p=e("../views").ModalTerminal,d=e("../views").ContainedBase,v=e("../visuals/visualization").Visualization,m=d.extend({tagName:"div",className:"gitDemonstrationView box horizontal",template:u.template($("#git-demonstration-view").html()),events:{"click div.command > p.uiButton":"positive"},initialize:function(t){t=t||{},this.options=t,this.JSON=u.extend({beforeMarkdowns:["## Git Commits","","Awesome!"],command:"git commit",afterMarkdowns:["Now you have seen it in action","","Go ahead and try the level!"]},t);var n=function(t){return e("markdown").markdown.toHTML(t.join("\n"))};this.JSON.beforeHTML=n(this.JSON.beforeMarkdowns),this.JSON.afterHTML=n(this.JSON.afterMarkdowns),this.container=new p({title:t.title||"Git Demonstration"}),this.render(),this.checkScroll(),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new c({events:this.navEvents,aliasMap:{enter:"positive",right:"positive",left:"negative"},wait:!0}),this.visFinished=!1,this.initVis(),t.wait||this.show()},receiveMetaNav:function(e,t){var n=this;e.navEvents.on("positive",this.positive,this),this.metaContainerView=t},checkScroll:function(){var e=this.$("div.demonstrationText").children(),t=u.map(e,function(e){return e.clientHeight}),n=u.reduce(t,function(e,t){return e+t});n<this.$("div.demonstrationText").height()&&this.$("div.demonstrationText").addClass("noLongText")},dispatchBeforeCommand:function(){if(!this.options.beforeCommand)return;l.splitTextCommand(this.options.beforeCommand,function(e){this.mainVis.gitEngine.dispatch(new h({rawStr:e}),a.defer())},this),this.mainVis.gitVisuals.refreshTreeHarsh()},takeControl:function(){this.hasControl=!0,this.keyboardListener.listen(),this.metaContainerView&&this.metaContainerView.lock()},releaseControl:function(){if(!this.hasControl)return;this.hasControl=!1,this.keyboardListener.mute(),this.metaContainerView&&this.metaContainerView.unlock()},reset:function(){this.mainVis.reset(),this.dispatchBeforeCommand(),this.demonstrated=!1,this.$el.toggleClass("demonstrated",!1),this.$el.toggleClass("demonstrating",!1)},positive:function(){if(this.demonstrated||!this.hasControl)return;this.demonstrated=!0,this.demonstrate()},demonstrate:function(){this.$el.toggleClass("demonstrating",!0);var e=a.defer();this.dispatchCommand(this.JSON.command,e),e.promise.then(u.bind(function(){this.$el.toggleClass("demonstrating",!1),this.$el.toggleClass("demonstrated",!0),this.releaseControl()},this))},negative:function(e){if(this.$el.hasClass("demonstrating"))return;this.keyboardListener.passEventBack(e)},dispatchCommand:function(e,t){var n=[];l.splitTextCommand(e,function(e){n.push(new h({rawStr:e}))},this);var r=a.defer(),i=r.promise;u.each(n,function(e,t){i=i.then(u.bind(function(){var t=a.defer();return this.mainVis.gitEngine.dispatch(e,t),t.promise},this)),i=i.then(function(){return a.delay(300)})},this),i=i.then(function(){t.resolve()}),r.resolve()},tearDown:function(){this.mainVis.tearDown(),m.__super__.tearDown.apply(this)},hide:function(){this.releaseControl(),this.reset(),this.visFinished&&(this.mainVis.setTreeIndex(-1),this.mainVis.setTreeOpacity(0)),this.shown=!1,m.__super__.hide.apply(this)},show:function(){this.takeControl(),this.visFinished&&setTimeout(u.bind(function(){this.shown&&(this.mainVis.setTreeIndex(300),this.mainVis.showHarsh())},this),this.getAnimationTime()*1),this.shown=!0,m.__super__.show.apply(this)},die:function(){if(!this.visFinished)return;m.__super__.die.apply(this)},initVis:function(){this.mainVis=new v({el:this.$("div.visHolder div.visHolderInside")[0],noKeyboardInput:!0,noClick:!0,smallCanvas:!0,zIndex:-1}),this.mainVis.customEvents.on("paperReady",u.bind(function(){this.visFinished=!0,this.dispatchBeforeCommand(),this.shown&&this.show()},this))}});n.GitDemonstrationView=m}),e.define("/src/js/views/builderViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../intl"),h=e("../util/keyboard").KeyboardListener,p=e("../views"),d=p.ModalTerminal,v=p.ContainedBase,m=v.extend({tagName:"div",className:"textGrabber box vertical",template:u.template($("#text-grabber").html()),initialize:function(e){e=e||{},this.JSON={helperText:e.helperText||"Enter some text"},this.container=e.container||new d({title:"Enter some text"}),this.render(),e.initialText&&this.setText(e.initialText),e.wait||this.show()},getText:function(){return this.$("textarea").val()},setText:function(e){this.$("textarea").val(e)}}),g=v.extend({tagName:"div",className:"markdownGrabber box horizontal",template:u.template($("#markdown-grabber-view").html()),events:{"keyup textarea":"keyup"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),e.fromObj&&(e.fillerText=e.fromObj.options.markdowns.join("\n")),this.JSON={previewText:e.previewText||"Preview",fillerText:e.fillerText||"## Enter some markdown!\n\n\n"},this.container=e.container||new d({title:e.title||"Enter some markdown"}),this.render();if(!e.withoutButton){var t=a.defer();t.promise.then(u.bind(this.confirmed,this)).fail(u.bind(this.cancelled,this)).done();var n=new p.ConfirmCancelView({deferred:t,destination:this.getDestination()})}this.updatePreview(),e.wait||this.show()},confirmed:function(){this.die(),this.deferred.resolve(this.getRawText())},cancelled:function(){this.die(),this.deferred.resolve()},keyup:function(){this.throttledPreview||(this.throttledPreview=u.throttle(u.bind(this.updatePreview,this),500)),this.throttledPreview()},getRawText:function(){return this.$("textarea").val()},exportToArray:function(){return this.getRawText().split("\n")},getExportObj:function(){return{markdowns:this.exportToArray()}},updatePreview:function(){var t=this.getRawText(),n=e("markdown").markdown.toHTML(t);this.$("div.insidePreview").html(n)}}),y=v.extend({tagName:"div",className:"markdownPresenter box vertical",template:u.template($("#markdown-presenter").html()),initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.JSON={previewText:e.previewText||"Here is something for you",fillerText:e.fillerText||"# Yay"},this.container=new d({title:"Check this out..."}),this.render();if(!e.noConfirmCancel){var t=new p.ConfirmCancelView({destination:this.getDestination()});t.deferred.promise.then(u.bind(function(){this.deferred.resolve(this.grabText())},this)).fail(u.bind(function(){this.deferred.reject()},this)).done(u.bind(this.die,this))}this.show()},grabText:function(){return this.$("textarea").val()}}),b=v.extend({tagName:"div",className:"demonstrationBuilder box vertical",template:u.template($("#demonstration-builder").html()),events:{"click div.testButton":"testView"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer();if(e.fromObj){var t=e.fromObj.options;e=u.extend({},e,t,{beforeMarkdown:t.beforeMarkdowns.join("\n"),afterMarkdown:t.afterMarkdowns.join("\n")})}this.JSON={},this.container=new d({title:"Demonstration Builder"}),this.render(),this.beforeMarkdownView=new g({container:this,withoutButton:!0,fillerText:e.beforeMarkdown,previewText:"Before demonstration Markdown"}),this.beforeCommandView=new m({container:this,helperText:"The git command(s) to set up the demonstration view (before it is displayed)",initialText:e.beforeCommand||"git checkout -b bugFix"}),this.commandView=new m({container:this,helperText:"The git command(s) to demonstrate to the reader",initialText:e.command||"git commit"}),this.afterMarkdownView=new g({container:this,withoutButton:!0,fillerText:e.afterMarkdown,previewText:"After demonstration Markdown"});var n=a.defer(),r=new p.ConfirmCancelView({deferred:n,destination:this.getDestination()});n.promise.then(u.bind(this.confirmed,this)).fail(u.bind(this.cancelled,this)).done()},testView:function(){var t=e("../views/multiView").MultiView;new t({childViews:[{type:"GitDemonstrationView",options:this.getExportObj()}]})},getExportObj:function(){return{beforeMarkdowns:this.beforeMarkdownView.exportToArray(),afterMarkdowns:this.afterMarkdownView.exportToArray(),command:this.commandView.getText(),beforeCommand:this.beforeCommandView.getText()}},confirmed:function(){this.die(),this.deferred.resolve(this.getExportObj())},cancelled:function(){this.die(),this.deferred.resolve()},getInsideElement:function(){return this.$(".insideBuilder")[0]}}),w=v.extend({tagName:"div",className:"multiViewBuilder box vertical",template:u.template($("#multi-view-builder").html()),typeToConstructor:{ModalAlert:g,GitDemonstrationView:b},events:{"click div.deleteButton":"deleteOneView","click div.testButton":"testOneView","click div.editButton":"editOneView","click div.testEntireView":"testEntireView","click div.addView":"addView","click div.saveView":"saveView","click div.cancelView":"cancel"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.multiViewJSON=e.multiViewJSON||{},this.JSON={views:this.getChildViews(),supportedViews:u.keys(this.typeToConstructor)},this.container=new d({title:"Build a MultiView!"}),this.render(),this.show()},saveView:function(){this.hide(),this.deferred.resolve(this.multiViewJSON)},cancel:function(){this.hide(),this.deferred.resolve()},addView:function(e){var t=e.target,n=$(t).attr("data-type"),r=a.defer(),i=this.typeToConstructor[n],s=new i({deferred:r});r.promise.then(u.bind(function(){var e={type:n,options:s.getExportObj()};this.addChildViewObj(e)},this)).fail(function(){}).done()},testOneView:function(t){var n=t.target,r=$(n).attr("data-index"),i=this.getChildViews()[r],s=e("../views/multiView").MultiView;new s({childViews:[i]})},testEntireView:function(){var t=e("../views/multiView").MultiView;new t({childViews:this.getChildViews()})},editOneView:function(e){var t=e.target,n=$(t).attr("data-index"),r=$(t).attr("data-type"),i=a.defer(),s=new this.typeToConstructor[r]({deferred:i,fromObj:this.getChildViews()[n]});i.promise.then(u.bind(function(){var e={type:r,options:s.getExportObj()},t=this.getChildViews();t[n]=e,this.setChildViews(t)},this)).fail(function(){}).done()},deleteOneView:function(e){var t=e.target,n=$(t).attr("data-index"),r=this.getChildViews(),i=r.slice(0,n).concat(r.slice(n+1));this.setChildViews(i),this.update()},addChildViewObj:function(e,t){var n=this.getChildViews();n.push(e),this.setChildViews(n),this.update()},setChildViews:function(e){this.multiViewJSON.childViews=e},getChildViews:function(){return this.multiViewJSON.childViews||[]},update:function(){this.JSON.views=this.getChildViews(),this.renderAgain()}});n.MarkdownGrabber=g,n.DemonstrationBuilder=b,n.TextGrabber=m,n.MultiViewBuilder=w,n.MarkdownPresenter=y}),e.define("/src/js/dialogs/levelBuilder.js",function(e,t,n,r,i,s,o){n.dialog={en_US:[{type:"ModalAlert",options:{markdowns:["## Welcome to the level builder!","","Here are the main steps:",""," * Set up the initial environment with git commands"," * Define the starting tree with ```define start```"," * Enter the series of git commands that compose the (optimal) solution"," * Define the goal tree with ```define goal```. Defining the goal also defines the solution"," * Optionally define a hint with ```define hint```"," * Edit the name with ```define name```"," * Optionally define a nice start dialog with ```edit dialog```"," * Enter the command ```finish``` to output your level JSON!"]}}],zh_CN:[{type:"ModalAlert",options:{markdowns:["## 使","","",""," * 使 git "," * 使 ```define start``` "," * git "," * 使 ```define goal``` "," * ```define hint``` "," * ```define name``` "," * ```edit dialog``` "," * ```finish``` JSON"]}}]}}),e.define("/src/js/util/eventBaton.js",function(e,t,n,r,i,s,o){function a(){this.eventMap={}}var u=e("underscore");a.prototype.stealBaton=function(e,t,n){if(!e)throw new Error("need name");if(!t)throw new Error("need func!");var r=this.eventMap[e]||[];r.push({func:t,context:n}),this.eventMap[e]=r},a.prototype.sliceOffArgs=function(e,t){var n=[];for(var r=e;r<t.length;r++)n.push(t[r]);return n},a.prototype.trigger=function(e){var t=this.sliceOffArgs(1,arguments),n=this.eventMap[e];if(!n||!n.length){console.warn("no listeners for",e);return}var r=n.slice(-1)[0];r.func.apply(r.context,t)},a.prototype.getNumListeners=function(e){var t=this.eventMap[e]||[];return t.length},a.prototype.getListenersThrow=function(e){var t=this.eventMap[e];if(!t||!t.length)throw new Error("no one has that baton!"+e);return t},a.prototype.passBatonBackSoft=function(e,t,n,r){try{return this.passBatonBack(e,t,n,r)}catch(i){}},a.prototype.passBatonBack=function(e,t,n,r){var i=this.getListenersThrow(e),s;u.each(i,function(e,r){if(r===0)return;e.func===t&&e.context===n&&(s=r-1)},this);if(s===undefined)throw new Error("you are the last baton holder! or i didnt find you");var o=i[s];o.func.apply(o.context,r)},a.prototype.releaseBaton=function(e,t,n){var r=this.getListenersThrow(e),i=[],s=!1;u.each(r,function(e){e.func===t&&e.context===n?(s&&(console.warn("woah duplicates!!!"),console.log(r)),s=!0):i.push(e)},this);if(!s)throw console.log("did not find that function",t,n,e,arguments),console.log(this.eventMap),new Error("cant releasebaton if yu dont have it");this.eventMap[e]=i},n.EventBaton=a}),e.define("/src/js/visuals/index.js",function(e,t,n,r,i,s,o){function w(t){t=t||{},this.options=t,this.commitCollection=t.commitCollection,this.branchCollection=t.branchCollection,this.visNodeMap={},this.visEdgeCollection=new b,this.visBranchCollection=new g,this.commitMap={},this.rootCommit=null,this.branchStackMap=null,this.upstreamBranchSet=null,this.upstreamHeadSet=null,this.paper=t.paper,this.gitReady=!1,this.branchCollection.on("add",this.addBranchFromEvent,this),this.branchCollection.on("remove",this.removeBranch,this),this.deferred=[],this.posBoundaries={min:0,max:1},this.flipFraction=.65;var n=e("../app");n.getEvents().on("refreshTree",this.refreshTree,this)}function E(e){var t=0,n=0,r=0,i=0,s=e.length;u.each(e,function(e){var s=e.split("(")[1];s=s.split(")")[0],s=s.split(","),r+=parseFloat(s[1]),i+=parseFloat(s[2]);var o=parseFloat(s[0]),u=o*Math.PI*2;t+=Math.cos(u),n+=Math.sin(u)}),t/=s,n/=s,r/=s,i/=s;var o=Math.atan2(n,t)/(Math.PI*2);return o<0&&(o+=1),"hsb("+String(o)+","+String(r)+","+String(i)+")"}var u=e("underscore"),a=e("q"),f=e("backbone"),l=e("../util/constants").GRAPHICS,c=e("../util/constants").GLOBAL,h=e("../models/collections"),p=h.CommitCollection,d=h.BranchCollection,v=e("../visuals/visNode").VisNode,m=e("../visuals/visBranch").VisBranch,g=e("../visuals/visBranch").VisBranchCollection,y=e("../visuals/visEdge").VisEdge,b=e("../visuals/visEdge").VisEdgeCollection;w.prototype.defer=function(e){this.deferred.push(e)},w.prototype.deferFlush=function(){u.each(this.deferred,function(e){e()},this),this.deferred=[]},w.prototype.resetAll=function(){var e=this.visEdgeCollection.toArray();u.each(e,function(e){e.remove()},this);var t=this.visBranchCollection.toArray();u.each(t,function(e){e.remove()},this),u.each(this.visNodeMap,function(e){e.remove()},this),this.visEdgeCollection.reset(),this.visBranchCollection.reset(),this.visNodeMap={},this.rootCommit=null,this.commitMap={}},w.prototype.tearDown=function(){this.resetAll(),this.paper.remove()},w.prototype.assignGitEngine=function(e){this.gitEngine=e,this.initHeadBranch(),this.deferFlush()},w.prototype.initHeadBranch=function(){this.addBranchFromEvent(this.gitEngine.HEAD)},w.prototype.getScreenPadding=function(){return{widthPadding:l.nodeRadius*1.5,topHeightPadding:l.nodeRadius*1.5,bottomHeightPadding:l.nodeRadius*5}},w.prototype.getFlipPos=function(){var e=this.posBoundaries.min,t=this.posBoundaries.max;return this.flipFraction*(t-e)+e},w.prototype.toScreenCoords=function(e){if(!this.paper.width)throw new Error("being called too early for screen coords");var t=this.getScreenPadding(),n=function(e,t,n){return n+e*(t-n*2)},r=function(e,t,n,r){return n+e*(t-r-n)};return{x:n(e.x,this.paper.width,t.widthPadding),y:r(e.y,this.paper.height,t.topHeightPadding,t.bottomHeightPadding)}},w.prototype.animateAllAttrKeys=function(e,t,n,r){var i=a.defer(),s=function(i){i.animateAttrKeys(e,t,n,r)};this.visBranchCollection.each(s),this.visEdgeCollection.each(s),u.each(this.visNodeMap,s);var o=n!==undefined?n:l.defaultAnimationTime;return setTimeout(function(){i.resolve()},o),i.promise},w.prototype.finishAnimation=function(){var e=this,t=a.defer(),n=a.defer(),r=l.defaultAnimationTime,i=l.nodeRadius,s="Solved!!\n:D",o=null,f=u.bind(function(){o=this.paper.text(this.paper.width/2,this.paper.height/2,s),o.attr({opacity:0,"font-weight":500,"font-size":"32pt","font-family":"Monaco, Courier, font-monospace",stroke:"#000","stroke-width":2,fill:"#000"}),o.animate({opacity:1},r)},this);return t.promise.then(u.bind(function(){return this.animateAllAttrKeys({exclude:["circle"]},{opacity:0},r*1.1)},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:i*2},r*1.5)},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:i*.75},r*.5)},this)).then(u.bind(function(){return f(),this.explodeNodes()},this)).then(u.bind(function(){return this.explodeNodes()},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{},r*1.25)},this)).then(u.bind(function(){return o.animate({opacity:0},r,undefined,undefined,function(){o.remove()}),this.animateAllAttrKeys({},{})},this)).then(function(){n.resolve()}).fail(function(e){console.warn("animation error"+e)}).done(),t.resolve(),n.promise},w.prototype.explodeNodes=function(){var e=a.defer(),t=[];u.each(this.visNodeMap,function(e){t.push(e.getExplodeStepFunc())});var n=setInterval(function(){var r=[];u.each(t,function(e){e()&&r.push(e)});if(!r.length){clearInterval(n),e.resolve();return}t=r},.025);return e.promise},w.prototype.animateAllFromAttrToAttr=function(e,t,n){var r=function(r){var i=r.getID();if(u.include(n,i))return;if(!e[i]||!t[i])return;r.animateFromAttrToAttr(e[i],t[i])};this.visBranchCollection.each(r),this.visEdgeCollection.each(r),u.each(this.visNodeMap,r)},w.prototype.genSnapshot=function(){this.fullCalc();var e={};return u.each(this.visNodeMap,function(t){e[t.get("id")]=t.getAttributes()},this),this.visBranchCollection.each(function(t){e[t.getID()]=t.getAttributes()},this),this.visEdgeCollection.each(function(t){e[t.getID()]=t.getAttributes()},this),e},w.prototype.refreshTree=function(e){if(!this.gitReady||!this.gitEngine.rootCommit)return;this.fullCalc(),this.animateAll(e)},w.prototype.refreshTreeHarsh=function(){this.fullCalc(),this.animateAll(0)},w.prototype.animateAll=function(e){this.zIndexReflow(),this.animateEdges(e),this.animateNodePositions(e),this.animateRefs(e)},w.prototype.fullCalc=function(){this.calcTreeCoords(),this.calcGraphicsCoords()},w.prototype.calcTreeCoords=function(){if(!this.rootCommit)throw new Error("grr, no root commit!");this.calcUpstreamSets(),this.calcBranchStacks(),this.calcDepth(),this.calcWidth()},w.prototype.calcGraphicsCoords=function(){this.visBranchCollection.each(function(e){e.updateName()})},w.prototype.calcUpstreamSets=function(){this.upstreamBranchSet=this.gitEngine.getUpstreamBranchSet(),this.upstreamHeadSet=this.gitEngine.getUpstreamHeadSet()},w.prototype.getCommitUpstreamBranches=function(e){return this.branchStackMap[e.get("id")]},w.prototype.getBlendedHuesForCommit=function(e){var t=this.upstreamBranchSet[e.get("id")];if(!t)throw new Error("that commit doesnt have upstream branches!");return this.blendHuesFromBranchStack(t)},w.prototype.blendHuesFromBranchStack=function(e){var t=[];return u.each(e,function(e){var n=e.obj.get("visBranch").get("fill");if(n.slice(0,3)!=="hsb"){var r=Raphael.color(n);n="hsb("+String(r.h)+","+String(r.l),n=n+","+String(r.s)+")"}t.push(n)}),E(t)},w.prototype.getCommitUpstreamStatus=function(e){if(!this.upstreamBranchSet)throw new Error("Can't calculate this yet!");var t=e.get("id"),n=this.upstreamBranchSet,r=this.upstreamHeadSet;return n[t]?"branch":r[t]?"head":"none"},w.prototype.calcBranchStacks=function(){var e=this.gitEngine.getBranches(),t={};u.each(e,function(e){var n=e.target.get("id");t[n]=t[n]||[],t[n].push(e),t[n].sort(function(e,t){var n=e.obj.get("id"),r=t.obj.get("id");return n=="master"||r=="master"?n=="master"?-1:1:n.localeCompare(r)})}),this.branchStackMap=t},w.prototype.calcWidth=function(){this.maxWidthRecursive(this.rootCommit),this.assignBoundsRecursive(this.rootCommit,this.posBoundaries.min,this.posBoundaries.max)},w.prototype.maxWidthRecursive=function(e){var t=0;u.each(e.get("children"),function(n){if(n.isMainParent(e)){var r=this.maxWidthRecursive(n);t+=r}},this);var n=Math.max(1,t);return e.get("visNode").set("maxWidth",n),n},w.prototype.assignBoundsRecursive=function(e,t,n,r){r=r===undefined?.5:r;var i=t+(n-t)*r;e.get("visNode").get("pos").x=i;if(e.get("children").length===0)return;var s=n-t,o=0,a=e.get("children");u.each(a,function(t){t.isMainParent(e)&&(o+=t.get("visNode").getMaxWidthScaled())},this);var f=function(e,t){return s<.99?a.length<2?t:.5:a.length<2?.5:e===0?1/3:e===a.length-1?2/3:t},l=t;u.each(a,function(t,n){if(!t.isMainParent(e))return;var i=t.get("visNode").getMaxWidthScaled(),u=i/o*s,a=f(n,r),c=l,h=c+u;this.assignBoundsRecursive(t,c,h,a),l=c+u},this)},w.prototype.calcDepth=function(){var e=this.calcDepthRecursive(this.rootCommit,0);e>15&&console.warn("graphics are degrading from too many layers");var t=this.getDepthIncrement(e);u.each(this.visNodeMap,function(e){e.setDepthBasedOn(t)},this)},w.prototype.animateNodePositions=function(e){u.each(this.visNodeMap,function(t){t.animateUpdatedPosition(e)},this)},w.prototype.addBranchFromEvent=function(e,t,n){var r=u.bind(function(){this.addBranch(e)},this);!this.gitEngine||!this.gitReady?this.defer(r):r()},w.prototype.addBranch=function(e){var t=new m({branch:e,gitVisuals:this,gitEngine:this.gitEngine});this.visBranchCollection.add(t),this.gitReady?t.genGraphics(this.paper):this.defer(u.bind(function(){t.genGraphics(this.paper)},this))},w.prototype.removeVisBranch=function(e){this.visBranchCollection.remove(e)},w.prototype.removeVisNode=function(e){this.visNodeMap[e.getID()]=undefined},w.prototype.removeVisEdge=function(e){this.visEdgeCollection.remove(e)},w.prototype.animateRefs=function(e){this.visBranchCollection.each(function(t){t.animateUpdatedPos(e)},this)},w.prototype.animateEdges=function(e){this.visEdgeCollection.each(function(t){t.animateUpdatedPath(e)},this)},w.prototype.getMinLayers=function(){return this.options.smallCanvas?4:7},w.prototype.getDepthIncrement=function(e){e=Math.max(e,this.getMinLayers());var t=1/e;return t},w.prototype.calcDepthRecursive=function(e,t){e.get("visNode").setDepth(t);var n=e.get("children"),r=t;return u.each(n,function(e){var n=this.calcDepthRecursive(e,t+1);r=Math.max(n,r)},this),r},w.prototype.canvasResize=function(e,t){this.resizeFunc||this.genResizeFunc(),this.resizeFunc(e,t)},w.prototype.genResizeFunc=function(){this.resizeFunc=u.debounce(u.bind(function(t,n){this.refreshTree()},this),200,!0)},w.prototype.addNode=function(e,t){this.commitMap[e]=t,t.get("rootCommit")&&(this.rootCommit=t);var n=new v({id:e,commit:t,gitVisuals:this,gitEngine:this.gitEngine});return this.visNodeMap[e]=n,this.gitReady&&n.genGraphics(this.paper),n},w.prototype.addEdge=function(e,t){var n=this.visNodeMap[e],r=this.visNodeMap[t];if(!n||!r)throw new Error("one of the ids in ("+e+", "+t+") does not exist");var i=new y({tail:n,head:r,gitVisuals:this,gitEngine:this.gitEngine});this.visEdgeCollection.add(i),this.gitReady&&i.genGraphics(this.paper)},w.prototype.zIndexReflow=function(){this.visNodesFront(),this.visBranchesFront()},w.prototype.visNodesFront=function(){u.each(this.visNodeMap,function(e){e.toFront()})},w.prototype.visBranchesFront=function(){this.visBranchCollection.each(function(e){e.nonTextToFront(),e.textToFront()}),this.visBranchCollection.each(function(e){e.textToFrontIfInStack()})},w.prototype.drawTreeFromReload=function(){this.gitReady=!0,this.deferFlush(),this.calcTreeCoords()},w.prototype.drawTreeFirstTime=function(){this.gitReady=!0,this.calcTreeCoords(),u.each(this.visNodeMap,function(e){e.genGraphics(this.paper)},this),this.visEdgeCollection.each(function(e){e.genGraphics(this.paper)},this),this.visBranchCollection.each(function(e){e.genGraphics(this.paper)},this),this.zIndexReflow()},n.GitVisuals=w}),e.define("/src/js/visuals/visNode.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{depth:undefined,maxWidth:null,outgoingEdges:null,circle:null,text:null,id:null,pos:null,radius:null,commit:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing,fill:f.defaultNodeFill,"stroke-width":f.defaultNodeStrokeWidth,stroke:f.defaultNodeStroke},getID:function(){return this.get("id")},validateAtInit:function(){if(!this.get("id"))throw new Error("need id for mapping");if(!this.get("commit"))throw new Error("need commit for linking");this.get("pos")||this.set("pos",{x:Math.random(),y:Math.random()})},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.set("outgoingEdges",[])},setDepth:function(e){this.set("depth",Math.max(this.get("depth")||0,e))},setDepthBasedOn:function(e){if(this.get("depth")===undefined){debugger;throw new Error("no depth yet!")}var t=this.get("pos");t.y=this.get("depth")*e},getMaxWidthScaled:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit")),t={branch:1,head:.3,none:.1};if(t[e]===undefined)throw new Error("bad stat");return t[e]*this.get("maxWidth")},toFront:function(){this.get("circle").toFront(),this.get("text").toFront()},getOpacity:function(){var e={branch:1,head:f.upstreamHeadOpacity,none:f.upstreamNoneOpacity},t=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));if(e[t]===undefined)throw new Error("invalid status");return e[t]},getTextScreenCoords:function(){return this.getScreenCoords()},getAttributes:function(){var e=this.getScreenCoords(),t=this.getTextScreenCoords(),n=this.getOpacity();return{circle:{cx:e.x,cy:e.y,opacity:n,r:this.getRadius(),fill:this.getFill(),"stroke-width":this.get("stroke-width"),stroke:this.get("stroke")},text:{x:t.x,y:t.y,opacity:n}}},highlightTo:function(e,t,n){var r=e.get("fill"),i={circle:{fill:r,stroke:r,"stroke-width":this.get("stroke-width")*5},text:{}};this.animateToAttr(i,t,n)},animateUpdatedPosition:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToSnapshot:function(e,t,n){if(!e[this.getID()])return;this.animateToAttr(e[this.getID()],t,n)},animateToAttr:function(e,t,n){if(t===0){this.get("circle").attr(e.circle),this.get("text").attr(e.text);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("circle").stop().animate(e.circle,r,i),this.get("text").stop().animate(e.text,r,i),n=="bounce"&&e.circle&&e.circle.cx!==undefined&&e.text&&e.text.x!==undefined&&(this.get("circle").animate(e.circle.cx,r,"easeInOut"),this.get("text").animate(e.text.x,r,"easeInOut"))},getScreenCoords:function(){var e=this.get("pos");return this.gitVisuals.toScreenCoords(e)},getRadius:function(){return this.get("radius")||f.nodeRadius},getParentScreenCoords:function(){return this.get("commit").get("parents")[0].get("visNode").getScreenCoords()},setBirthPosition:function(){var e=this.getParentScreenCoords();this.get("circle").attr({cx:e.x,cy:e.y,opacity:0,r:0}),this.get("text").attr({x:e.x,y:e.y,opacity:0})},setBirthFromSnapshot:function(e){var t=this.get("commit").get("parents")[0].get("visNode").getID(),n=e[t];this.get("circle").attr({opacity:0,r:0,cx:n.circle.cx,cy:n.circle.cy}),this.get("text").attr({opacity:0,x:n.text.x,y:n.text.y});var r={x:n.circle.cx,y:n.circle.cy};this.setOutgoingEdgesBirthPosition(r)},setBirth:function(){this.setBirthPosition(),this.setOutgoingEdgesBirthPosition(this.getParentScreenCoords())},setOutgoingEdgesOpacity:function(e){u.each(this.get("outgoingEdges"),function(t){t.setOpacity(e)})},animateOutgoingEdgesToAttr:function(e,t,n){u.each(this.get("outgoingEdges"),function(t){var n=e[t.getID()];t.animateToAttr(n)},this)},animateOutgoingEdges:function(e,t){u.each(this.get("outgoingEdges"),function(n){n.animateUpdatedPath(e,t)},this)},animateOutgoingEdgesFromSnapshot:function(e,t,n){u.each(this.get("outgoingEdges"),function(r){var i=e[r.getID()];r.animateToAttr(i,t,n)},this)},setOutgoingEdgesBirthPosition:function(e){u.each(this.get("outgoingEdges"),function(t){var n=t.get("head").getScreenCoords(),r=t.genSmoothBezierPathStringFromCoords(e,n);t.get("path").stop().attr({path:r,opacity:0})},this)},parentInFront:function(){this.get("commit").get("parents")[0].get("visNode").toFront()},getFontSize:function(e){return e.length<3?12:e.length<5?10:8},getFill:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));return e=="head"?f.headRectFill:e=="none"?f.orphanNodeFill:this.gitVisuals.getBlendedHuesForCommit(this.get("commit"))},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("commit").get("id"),n=e("../app");u.each([this.get("circle"),this.get("text")],function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},setOpacity:function(e){e=e===undefined?1:e;var t=["circle","text"];u.each(t,function(t){this.get(t).attr({opacity:e})},this)},remove:function(){this.removeKeys(["circle"],["text"]);var e=this.get("text");e&&e.remove(),this.gitVisuals.removeVisNode(this)},removeAll:function(){this.remove(),u.each(this.get("outgoingEdges"),function(e){e.remove()},this)},getExplodeStepFunc:function(){var e=this.get("circle"),t=20,n=Math.PI+Math.random()*1*Math.PI,r=.2,i=.01,s=t*Math.cos(n),o=t*Math.sin(n),u=e.attr("cx"),a=e.attr("cy"),f=this.gitVisuals.paper.width,l=this.gitVisuals.paper.height,c=.8,h=1,p=function(){o+=r*h-i*o,s-=i*s,u+=s*h,a+=o*h;if(u<0||u>f)s=c*-s,u=u<0?0:f;if(a<0||a>l)o=c*-o,a=a<0?0:l;return e.attr({cx:u,cy:a}),s*s+o*o<.01&&Math.abs(a-l)===0?!1:!0};return p},genGraphics:function(){var e=this.gitVisuals.paper,t=this.getScreenCoords(),n=this.getTextScreenCoords(),r=e.circle(t.x,t.y,this.getRadius()).attr(this.getAttributes().circle),i=e.text(n.x,n.y,String(this.get("id")));i.attr({"font-size":this.getFontSize(this.get("id")),"font-weight":"bold","font-family":"Monaco, Courier, font-monospace",opacity:this.getOpacity()}),this.set("circle",r),this.set("text",i),this.attachClickHandlers()}});n.VisNode=c}),e.define("/src/js/visuals/visBase.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e.define("/src/js/visuals/visBranch.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=function(){var e=Math.random(),t="hsb("+String(e)+",0.7,1)";return t},h=l.extend({defaults:{pos:null,text:null,rect:null,arrow:null,isHead:!1,flip:1,fill:f.rectFill,stroke:f.rectStroke,"stroke-width":f.rectStrokeWidth,offsetX:f.nodeRadius*4.75,offsetY:0,arrowHeight:14,arrowInnerSkew:0,arrowEdgeHeight:6,arrowLength:14,arrowOffsetFromCircleX:10,vPad:5,hPad:5,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){if(!this.get("branch"))throw new Error("need a branch!")},getID:function(){return this.get("branch").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine");if(!this.gitEngine)throw new Error("asd wtf");this.get("branch").set("visBranch",this);var e=this.get("branch").get("id");e=="HEAD"?(this.set("isHead",!0),this.set("flip",-1),this.set("fill",f.headRectFill)):e!=="master"&&this.set("fill",c())},getCommitPosition:function(){var e=this.gitEngine.getCommitFromRef(this.get("branch")),t=e.get("visNode");return this.set("flip",this.getFlipBool(e,t)),t.getScreenCoords()},getFlipBool:function(e,t){var n=this.get("gitVisuals").getFlipPos(),r=t.get("pos").x>n;return this.get("isHead")?r?this.isBranchStackEmpty()?-1:1:this.isBranchStackEmpty()?1:-1:r?-1:1},getBranchStackIndex:function(){if(this.get("isHead"))return 0;var e=this.getBranchStackArray(),t=-1;return u.each(e,function(e,n){e.obj==this.get("branch")&&(t=n)},this),t},getBranchStackLength:function(){return this.get("isHead")?1:this.getBranchStackArray().length},isBranchStackEmpty:function(){var e=this.gitVisuals.branchStackMap[this.getCommitID()];return e?e.length===0:!0},getCommitID:function(){var e=this.get("branch").get("target");return e.get("type")==="branch"&&(e=e.get("target")),e.get("id")},getBranchStackArray:function(){var e=this.gitVisuals.branchStackMap[this.getCommitID()];return e===undefined?(this.gitVisuals.calcBranchStacks(),this.getBranchStackArray()):e},getTextPosition:function(){var e=this.getCommitPosition(),t=this.getBranchStackIndex();return{x:e.x+this.get("flip")*this.get("offsetX"),y:e.y+t*f.multiBranchY+this.get("offsetY")}},getRectPosition:function(){var e=this.getTextPosition(),t=this.get("flip"),n=this.getTextSize();return{x:e.x-.5*n.w-this.get("hPad"),y:e.y-.5*n.h-this.get("vPad")}},getArrowPath:function(){var e=function(e,t,n){return{x:e.x+t,y:e.y+n}},t=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},n=this.get("flip"),r=e(this.getCommitPosition(),n*this.get("arrowOffsetFromCircleX"),0),i=e(r,n*this.get("arrowLength"),-this.get("arrowHeight")),s=e(r,n*this.get("arrowLength"),this.get("arrowHeight")),o=e(i,n*this.get("arrowInnerSkew"),this.get("arrowEdgeHeight")),a=e(s,n*this.get("arrowInnerSkew"),-this.get("arrowEdgeHeight")),f=49,l=e(o,n*f,0),c=e(a,n*f,0),h="";h+="M"+t(l)+" ";var p=[o,i,r,s,a,c];return u.each(p,function(e){h+="L"+t(e)+" "},this),h+="z",h},getTextSize:function(){var e=function(e){var t=e.get("text")?e.get("text").node:null;return t===null?0:t.clientWidth},t=function(e){return e.w||(e.w=75),e.h||(e.h=20),e},n=this.get("text").node;if(this.get("isHead"))return t({w:n.clientWidth,h:n.clientHeight});var r=0;return u.each(this.getBranchStackArray(),function(t){r=Math.max(r,e(t.obj.get("visBranch")))}),t({w:r,h:n.clientHeight})},getSingleRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad");return{w:e.w+t*2,h:e.h+n*2}},getRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad"),r=this.getBranchStackLength();return{w:e.w+t*2,h:e.h*r*1.1+n*2}},getName:function(){var e=this.get("branch").get("id"),t=this.gitEngine.HEAD.get("target").get("id"),n=t==e?"*":"";return e+n},nonTextToFront:function(){this.get("arrow").toFront(),this.get("rect").toFront()},textToFront:function(){this.get("text").toFront()},textToFrontIfInStack:function(){this.getBranchStackIndex()!==0&&this.get("text").toFront()},getFill:function(){return this.get("isHead")||this.getBranchStackLength()==1||this.getBranchStackIndex()!==0?this.get("fill"):this.gitVisuals.blendHuesFromBranchStack(this.getBranchStackArray())},remove:function(){this.removeKeys(["text","arrow","rect"]),this.gitVisuals.removeVisBranch(this)},genGraphics:function(e){var t=this.getTextPosition(),n=this.getName(),r;r=e.text(t.x,t.y,String(n)),r.attr({"font-size":14,"font-family":"Monaco, Courier, font-monospace",opacity:this.getTextOpacity()}),this.set("text",r);var i=this.getRectPosition(),s=this.getRectSize(),o=e.rect(i.x,i.y,s.w,s.h,8).attr(this.getAttributes().rect);this.set("rect",o);var u=this.getArrowPath(),a=e.path(u).attr(this.getAttributes().arrow);this.set("arrow",a),this.attachClickHandlers(),o.toFront(),r.toFront()},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("branch").get("id"),n=e("../app"),r=[this.get("rect"),this.get("text"),this.get("arrow")];u.each(r,function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},updateName:function(){this.get("text").attr({text:this.getName()})},getNonTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:this.getBranchStackIndex()===0?1:0},getTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:1},getAttributes:function(){var e=this.getNonTextOpacity(),t=this.getTextOpacity();this.updateName();var n=this.getTextPosition(),r=this.getRectPosition(),i=this.getRectSize(),s=this.getArrowPath();return{text:{x:n.x,y:n.y,opacity:t},rect:{x:r.x,y:r.y,width:i.w,height:i.h,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")},arrow:{path:s,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")}}},animateUpdatedPos:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("text").attr(e.text),this.get("rect").attr(e.rect),this.get("arrow").attr(e.arrow);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("text").stop().animate(e.text,r,i),this.get("rect").stop().animate(e.rect,r,i),this.get("arrow").stop().animate(e.arrow,r,i)}}),p=a.Collection.extend({model:h});n.VisBranchCollection=p,n.VisBranch=h,n.randomHueString=c}),e.define("/src/js/visuals/visEdge.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{tail:null,head:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){var e=["tail","head"];u.each(e,function(e){if(!this.get(e))throw new Error(e+" is required!")},this)},getID:function(){return this.get("tail").get("id")+"."+this.get("head").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.get("tail").get("outgoingEdges").push(this)},remove:function(){this.removeKeys(["path"]),this.gitVisuals.removeVisEdge(this)},genSmoothBezierPathString:function(e,t){var n=e.getScreenCoords(),r=t.getScreenCoords();return this.genSmoothBezierPathStringFromCoords(n,r)},genSmoothBezierPathStringFromCoords:function(e,t){var n=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},r=function(e,t,n){return n=n||f.curveControlPointOffset,{x:e.x,y:e.y+n*t}},i=function(e,t,n){return{x:e.x+t,y:e.y+n}};e=r(e,-1,this.get("tail").getRadius()),t=r(t,1,this.get("head").getRadius());var s="";s+="M"+n(e)+" ",s+="C",s+=n(r(e,-1))+" ",s+=n(r(t,1))+" ",s+=n(t);var o=f.arrowHeadSize||10;return s+=" L"+n(i(t,-o,o)),s+=" L"+n(i(t,o,o)),s+=" L"+n(t),s+="C",s+=n(r(t,1))+" ",s+=n(r(e,-1))+" ",s+=n(e),s},getBezierCurve:function(){return this.genSmoothBezierPathString(this.get("tail"),this.get("head"))},getStrokeColor:function(){return f.visBranchStrokeColorNone},setOpacity:function(e){e=e===undefined?1:e,this.get("path").attr({opacity:e})},genGraphics:function(e){var t=this.getBezierCurve(),n=e.path(t).attr({"stroke-width":f.visBranchStrokeWidth,stroke:this.getStrokeColor(),"stroke-linecap":"round","stroke-linejoin":"round",fill:this.getStrokeColor()});n.toBack(),this.set("path",n)},getOpacity:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("tail")),t={branch:1,head:f.edgeUpstreamHeadOpacity,none:f.edgeUpstreamNoneOpacity};if(t[e]===undefined)throw new Error("bad stat");return t[e]},getAttributes:function(){var e=this.getBezierCurve(),t=this.getOpacity();return{path:{path:e,opacity:t}}},animateUpdatedPath:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("path").attr(e.path);return}this.get("path").toBack(),this.get("path").stop().animate(e.path,t!==undefined?t:this.get("animationSpeed"),n||this.get("animationEasing"))}}),h=a.Collection.extend({model:c});n.VisEdgeCollection=h,n.VisEdge=c}),e.define("/src/js/level/disabledMap.js",function(e,t,n,r,i,s,o){function h(e){e=e||{},this.disabledMap=e.disabledMap||{"git cherry-pick":!0,"git rebase":!0}}var u=e("underscore"),a=e("../intl"),f=e("../git/commands"),l=e("../util/errors"),c=l.GitError;h.prototype.getInstantCommands=function(){var e=[],t=function(){throw new c({msg:a.str("command-disabled")})};return u.each(this.disabledMap,function(n,r){var i=f.regexMap[r];if(!i)throw new Error("wuttttt this disbaled command"+r+" has no regex matching");e.push([i,t])}),e},n.DisabledMap=h}),e.define("/src/js/dialogs/confirmShowSolution.js",function(e,t,n,r,i,s,o){n.dialog={en_US:[{type:"ModalAlert",options:{markdowns:["## Are you sure you want to see the solution?","","I believe in you! You can do it"]}}],zh_CN:[{type:"ModalAlert",options:{markdowns:["## ","",""]}}]}}),e.define("/src/js/level/arbiter.js",function(e,t,n,r,i,s,o){function h(){this.levelMap={},this.levelSequences=f,this.sequences=[],this.init();var e;try{e=JSON.parse(localStorage.getItem("solvedMap")||"{}")}catch(t){console.warn("local storage failed",t)}this.solvedMap=e||{},c.getEvents().on("levelSolved",this.levelSolved,this)}var u=e("underscore"),a=e("backbone"),f=e("../../levels").levelSequences,l=e("../../levels").sequenceInfo,c=e("../app");h.prototype.init=function(){var e;u.each(this.levelSequences,function(e,t){this.sequences.push(t);if(!e||!e.length)throw new Error("no empty sequences allowed");u.each(e,function(e,n){this.validateLevel(e);var r=t+String(n+1),i=u.extend({},e,{index:n,id:r,sequenceName:t});this.levelMap[r]=i,this.levelSequences[t][n]=i},this)},this)},h.prototype.isLevelSolved=function(e){if(!this.levelMap[e])throw new Error("that level doesnt exist!");return Boolean(this.solvedMap[e])},h.prototype.levelSolved=function(e){if(!e)return;this.solvedMap[e]=!0,this.syncToStorage()},h.prototype.resetSolvedMap=function(){this.solvedMap={},this.syncToStorage(),c.getEvents().trigger("levelSolved")},h.prototype.syncToStorage=function(){try{localStorage.setItem("solvedMap",JSON.stringify(this.solvedMap))}catch(e){console.warn("local storage fialed on set",e)}},h.prototype.validateLevel=function(e){e=e||{};var t=["name","goalTreeString","solutionCommand"],n=["hint","disabledMap","startTree"];u.each(t,function(t){if(e[t]===undefined)throw console.log(e),new Error("I need this field for a level: "+t)})},h.prototype.getSequenceToLevels=function(){return this.levelSequences},h.prototype.getSequences=function(){return u.keys(this.levelSequences)},h.prototype.getLevelsInSequence=function(e){if(!this.levelSequences[e])throw new Error("that sequecne name "+e+"does not exist");return this.levelSequences[e]},h.prototype.getSequenceInfo=function(e){return l[e]},h.prototype.getLevel=function(e){return this.levelMap[e]},h.prototype.getNextLevel=function(e){if(!this.levelMap[e])return console.warn("that level doesnt exist!!!"),null;var t=this.levelMap[e],n=t.sequenceName,r=this.levelSequences[n],i=t.index+1;if(i<r.length)return r[i];var s=this.sequences.indexOf(n)+1;if(s<this.sequences.length){var o=this.sequences[s];return this.levelSequences[o][0]}return null},n.LevelArbiter=h}),e.define("/src/levels/index.js",function(e,t,n,r,i,s,o){n.levelSequences={intro:[e("../../levels/intro/commits").level,e("../../levels/intro/branching").level,e("../../levels/intro/merging").level,e("../../levels/intro/rebasing").level],rampup:[e("../../levels/rampup/detachedHead").level,e("../../levels/rampup/relativeRefs").level,e("../../levels/rampup/relativeRefs2").level,e("../../levels/rampup/reversingChanges").level],rebase:[e("../../levels/rebase/manyRebases").level,e("../../levels/rebase/selectiveRebase").level],mixed:[e("../../levels/mixed/grabbingOneCommit").level,e("../../levels/mixed/jugglingCommits").level,e("../../levels/mixed/jugglingCommits2").level],advanced:[e("../../levels/advanced/multipleParents").level]},n.sequenceInfo={intro:{displayName:{en_US:"Introduction Sequence",fr_FR:"Sequence d'introduction",zh_CN:"",ko:" "},about:{en_US:"A nicely paced introduction to the majority of git commands",fr_FR:"Une introduction en douceur à la majoité des commandes git",zh_CN:" Git ",ko:" git "}},rampup:{displayName:{en_US:"Ramping Up"},about:{en_US:"The next serving of 100% git awesomes-ness. Hope you're hungry"}},rebase:{displayName:{en_US:"Master the Rebase Luke!",fr_FR:"Maîtrise Rebase, Luke!",zh_CN:"",ko:" !"},about:{en_US:"What is this whole rebase hotness everyone is talking about? Find out!",fr_FR:"Que'est-ce que c'est que ce rebase dont tout le monde parle ? Découvrez-le !",ko:" rebase !",zh_CN:""}},mixed:{displayName:{en_US:"A Mixed Bag",fr_FR:"Un assortiment",ko:"",zh_CN:""},about:{en_US:"A mixed bag of Git techniques, tricks, and tips",fr_FR:"Un assortiment de techniques et astuces pour utiliser Git",ko:"Git ",zh_CN:"Git"}},advanced:{displayName:{en_US:"Advanced Topics"},about:{en_US:"For the truly brave!"}}}}),e.define("/levels/intro/commits.js",function(e,t,n,r,i,s,o){n.level={name:{en_US:"Introduction to Git Commits",fr_FR:"Introduction aux commits avec Git",ko:"Git ",zh_CN:"Git"},goalTreeString:'{"branches":{"master":{"target":"C3","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"master","id":"HEAD"}}',solutionCommand:"git commit;git commit",startTree:'{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}',hint:{en_US:"Just type in 'git commit' twice to finish!",fr_FR:"Il suffit de saisir 'git commit' deux fois pour réussir !",zh_CN:" 'git commit' ",ko:"'git commit' !"},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","A commit in a git repository records a snapshot of all the files in your directory. It's like a giant copy and paste, but even better!","","Git wants to keep commits as lightweight as possible though, so it doesn't just copy the entire directory every time you commit. It actually stores each commit as a set of changes, or a \"delta\", from one version of the repository to the next. That's why most commits have a parent commit above them -- you'll see this later in our visualizations.","",'In order to clone a repository, you have to unpack or "resolve" all these deltas. That\'s why you might see the command line output:',"","`resolving deltas`","","when cloning a repo.","","It's a lot to take in, but for now you can think of commits as snapshots of the project. Commits are very light and switching between them is wicked fast!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what this looks like in practice. On the right we have a visualization of a (small) git repository. There are two commits right now -- the first initial commit, `C0`, and one commit after that `C1` that might have some meaningful changes.","","Hit the button below to make a new commit"],afterMarkdowns:["There we go! Awesome. We just made changes to the repository and saved them as a commit. The commit we just made has a parent, `C1`, which references which commit it was based off of."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Go ahead and try it out on your own! After this window closes, make two commits to complete the level"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commits Git","Un commit dans un dépôt (repository) git enregistre une image (snapshot) de tous les fichiers du repertoire. Comme un Copier-Coller géant, mais en bien mieux !","","Git fait en sorte que les commits soient aussi légers que possible donc il ne recopie pas tous le répertoire à chaque commit. En fait, git n'enregistre que l'ensemble des changments (\"delta\") depuis la version précédante du dépôt. C'est pour cette raison que la plupart des commits ont un commit parent -- ainsi que nous le verrons plus tard.","",'Pour cloner un dépôt, il faut décompresser ("résoudre") tous ces deltas. C\'est la raison pour laquelle la commande écrit :',"","`resolving deltas`","","lorsque l'on clone un dépôt.","","C'est beaucoup à absorber, mais pour l'instant vous pouvez considérer les commits comme des snapshots du projet. Les commits sont très légers et passer de l'un à l'autre est très rapide !"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Voyons à quoi cela ressemble en pratique. Sur la droite, on peut visualiser un (petit) dépôt git. Il y a pour l'instant deux commits -- le premier commit initial, `C0`, et un commit suivant `C1` qui aurait des changements significatifs.","","Appuyez sur le bouton ci-dessous pour faire un nouveau commit"],afterMarkdowns:["C'est parti ! Super. Nous venons de faire des modifications sur le dépôt et de saugevarder celles-ci dans un commit. Ce commit que nous venons de faire a un parent, `C1`, qui référence le commit sur lequel il est basé."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Allez-y et essayez par vous-même ! Après la fermeture de cettefenêtre, faites deux commits pour terminer ce niveau."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git "," Git . !","",'Git , . ("delta" ) . . -- .',""," (clone), (delta) , . ","","`resolving deltas`",""," , . !"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" . git . -- `C0`, `C1` .",""," "],afterMarkdowns:[" ! . . `C1`, ."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:[" ! , "]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","使 git commit git ","",'Git " delta"parent commit -- ',"","cloneunpackresolve","","`resolving deltas`","",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["使 git `C0``C1`","",""],command:"git commit",afterMarkdowns:["parent `C1``C1`"],beforeCommand:""}},{type:"ModalAlert",options:{markdowns:[""]}}]}}}}),e.define("/levels/intro/branching.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C1","id":"master"},"bugFix":{"target":"C1","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',solutionCommand:"git branch bugFix;git checkout bugFix",name:{en_US:"Branching in Git",ko:"Git ",fr_FR:"Gérer les branches avec Git",zh_CN:"Git"},hint:{en_US:'Make a new branch with "git branch [name]" and check it out with "git checkout [name]"',fr_FR:'Faites une nouvelle branche avec "git branch [nom]" positionnez-vous dans celle-ci avec "git checkout [nom]"',zh_CN:" 'git branch []' 'git checkout []' ",ko:'"git branch []" , "git checkout []" '},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branches","","Branches in Git are incredibly lightweight as well. They are simply references to a specific commit -- nothing more. This is why many Git enthusiasts chant the mantra:","","```","branch early, and branch often","```","","Because there is no storage / memory overhead with making many branches, it's easier to logically divide up your work than have big beefy branches.","",'When we start mixing branches and commits, we will see how these two features combine. For now though, just remember that a branch essentially says "I want to include the work of this commit and all parent commits."']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what branches look like in practice.","","Here we will check out a new branch named `newImage`"],afterMarkdowns:["There, that's all there is to branching! The branch `newImage` now refers to commit `C1`"],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's try to put some work on this new branch. Hit the button below"],afterMarkdowns:["Oh no! The `master` branch moved but the `newImage` branch didn't! That's because we weren't \"on\" the new branch, which is why the asterisk (*) was on `master`"],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's tell git we want to checkout the branch with","","```","git checkout [name]","```","","This will put us on the new branch before committing our changes"],afterMarkdowns:["There we go! Our changes were recorded on the new branch"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ok! You are all ready to get branching. Once this window closes,","make a new branch named `bugFix` and switch to that branch"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches Git","","Les branches sous Git sont incroyablement légères aussi. Elles sont simplment des références un commit spécifique -- rien de plus. C'est pourquoi beaucoup d'enthousiastes répètent en cœur :","","```","n'attendez pas pour faire des branches, et faites souvent des branches","```","","Parce qu'il n'y a pas de surcoût (stockage/mémoire) associés aux branches, il est facile de diviser son travail en de nombreuses branches plutôt que d'avoir quelques grosses branches.","","Nous verrons comment les banches et les commits interagissent quand nous les utiliserons ensemble. Pour l'instant, souvenez-vous qu'une branche est un moyen d'exprimer \"Je veux inclure le contenu de ce commit et de tous les commits parents.\""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Regardons à quoi ressemblent les branches en pratique.","","Nous allons nous positionner (checkout) dans une nouvelle branche appellée `newImage`"],afterMarkdowns:["Et voilà, c'est tout ! La branche `newImage` se réfère désormais au commit `C1`"],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Travaillons mainenant dans cette branche. Appuyez sur le bouton ci-dessous."],afterMarkdowns:["Oh non! La branche `master` a bougé mais pas la branche `newImage` ! C'est parce aue nous n'étions pas \"sur\" la nouvelle branche, comme indiqué par l'asterisque (*) sur `master`"],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Indiquons à git que nous voulons nous positionner sur la branche avec ","","```","git checkout [nom]","```","","Ceci nous positionne sur la nouvelle branche avant de faire un commit avec nos modifications"],afterMarkdowns:["C'est parti ! Nos modifications ont été enregistrées sur la nouvelle branche"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ok! Vous êtes fin prêt pour faire des branches. Après la fermeture de cette fenêtre,","faites une nouvelle branche nommée `bugFix` et positionnez-vous sur cette branche"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branches",""," Git reference Git ","","```","branch early, and branch often","```","","使使beefy","","使使I want to include the work of this commit and all parent commits."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["","","check out `newImage` "],command:"git branch newImage",afterMarkdowns:["`newImage` `C1`"],beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[""],command:"git commit",afterMarkdowns:["`master` `newImage` * `master` "],beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" git","","```","git checkout [name]","```","",""],command:"git checkout newImage; git commit",afterMarkdowns:[""],beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["使"," `bugFix` "]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git ",""," . (reference) . Git :","","```"," , ","```",""," , , .","",' , . , " " .']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" .","","`newImage` ."],afterMarkdowns:[" ! `newImage` `C1` "],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" . "],afterMarkdowns:["! `master` , `newImage` ! . (*) `master` ."],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" .","","```","git checkout []","```",""," ."],afterMarkdowns:["! !"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["! . ,","`bugFix` , "]}}]}}}}),e.define("/levels/intro/merging.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C4","id":"master"},"bugFix":{"target":"C2","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3","C2"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}',solutionCommand:"git checkout -b bugFix;git commit;git checkout master;git commit;git merge bugFix",name:{en_US:"Merging in Git",fr_FR:"Faire des 'merge' (fusions de branches) avec Git",ko:"Git (Merge)",zh_CN:"Git(Merge)"},hint:{en_US:"Remember to commit in the order specified (bugFix before master)",fr_FR:"Pensez à faire des commits dans l'ordre indiqué (bugFix avant master)",zh_CN:"(commit) bugFix master ",ko:" (bugFix master )"},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches and Merging","","Great! We now know how to commit and branch. Now we need to learn some kind of way of combining the work from two different branches together. This will allow us to branch off, develop a new feature, and then combine it back in.","",'The first method to combine work that we will examine is `git merge`. Merging in Git creates a special commit that has two unique parents. A commit with two parents essentially means "I want to include all the work from this parent over here and this one over here, *and* the set of all their parents."',"","It's easier with visuals, let's check it out in the next view"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches; each has one commit that's unique. This means that neither branch includes the entire set of \"work\" in the repository that we have done. Let's fix that with merge.","","We will `merge` the branch `bugFix` into `master`"],afterMarkdowns:["Woah! See that? First of all, `master` now points to a commit that has two parents. If you follow the arrows upstream from `master`, you will hit every commit along the way to the root. This means that `master` contains all the work in the repository now.","","Also, see how the colors of the commits changed? To help with learning, I have included some color coordination. Each branch has a unique color. Each commit turns a color that is the blended combination of all the branches that contain that commit.","","So here we see that the `master` branch color is blended into all the commits, but the `bugFix` color is not. Let's fix that..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's merge `master` into `bugFix`:"],afterMarkdowns:["Since `bugFix` was downstream of `master`, git didn't have to do any work; it simply just moved `bugFix` to the same commit `master` was attached to.","","Now all the commits are the same color, which means each branch contains all the work in the repository! Woohoo"],command:"git checkout bugFix; git merge master",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following steps:","","* Make a new branch called `bugFix`","* Checkout the `bugFix` branch with `git checkout bugFix`","* Commit once","* Go back to `master` with `git checkout`","* Commit another time","* Merge the branch `bugFix` into `master` with `git merge`","",'*Remember, you can always re-display this dialog with "help level"!*']}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches et Merges","","Super! Nous savons désormais comment faire des commits et de branches. Maintenant nous devons apprendre comment combiner ensemble les contenus de deux branches différentes. Ceci nous permettra de créer une nouvelle branche, développer une nouvelle fonctionnalité sur cette dernière, puis intégrer cette fonctionnalité en combinant le contenu de cette branche de développement à la branche d'origine(master par exemple).","","La première méthode que nous alons voir pour combiner le conenu de deux branches est `git merge`. Faire un 'merge' en git Git crée un commit spécial qui a deux parents. Un commit avec deux parents indique en susbtance \"Je veux inclure le contenu de ce parent et le conenu de cet autre parent, *et* l'ensemble de leurs parents.\"","","C'est plus facile en visualisant, regardons dans la vue suivante"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches; each has one commit that's unique. This means that neither branch includes the entire set of \"work\" in the repository that we have done. Let's fix that with merge.","","We will `merge` the branch `bugFix` into `master`"],afterMarkdowns:["Woah! See that? First of all, `master` now points to a commit that has two parents. If you follow the arrows upstream from `master`, you will hit every commit along the way to the root. This means that `master` contains all the work in the repository now.","","Also, see how the colors of the commits changed? To help with learning, I have included some color coordination. Each branch has a unique color. Each commit turns a color that is the blended combination of all the branches that contain that commit.","","So here we see that the `master` branch color is blended into all the commits, but the `bugFix` color is not. Let's fix that..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Faisons un merge de `master` dans `bugFix`:"],afterMarkdowns:["Puisque `bugFix` était un descendant de `master`, git n'avait aucun travail à effectuer; il a simplement déplacé `bugFix` au même commit auquel `master` est attaché.","","Maintenant tous les commits sont de la même couleur, ce qui indique que chaque branche contient tout le contenu du dépôt ! Woohoo"],command:"git checkout bugFix; git merge master",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Pour accomplir ce niveau, effectuez les opérations suivantes :","","* Faites une nouvelle branche appelée `bugFix`","* Positionnez-vous sur la branche `bugFix` avec `git checkout bugFix`","* Faites un commit","* Retournez sur la branche `master` (commande `git checkout`)","* Faites un nouveau commit","* Fusionnez la branche `bugFix` dans `master` avec `git merge`","",'*Rappelez-vous que vous pouvez à tout moment réafficher ces indications avec "help level"!*']}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches and Merging","","Great! 使西西",""," `git merge` Git Mergingcommit**","",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["",""," `bugFix` `master` "],command:"git merge bugFix",afterMarkdowns:["`master` `master` 沿沿 `master` ","","",""," `master` `bugFix` "],beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" `master` `bugFix` "],command:"git checkout bugFix; git merge master",afterMarkdowns:[" `bugFix` `master` git `master` `bugFix` ","","西"],beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["","","* `bugFix` ","* `git checkout bugFix` `bugFix`","* ","* `git checkout` `master` ","* ","* `git merge` `bugFix` `master` ","",'*使 "help level" *']}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## (Merge)","","! . . , .","",' `git merge`. Git (merge) (parent) . " , ** " . ',""," . ."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" . . . (merge) ?","","`bugFix` `master` (merge) ."],afterMarkdowns:["? , `master` . ","",", ? . . , .",""," `bugFix` `master` . ..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" `master` `bugFix` (merge) :"],afterMarkdowns:["`bugFix` `master` , git ; `bugFix` `master` .","","! , ."],command:"git checkout bugFix; git merge master",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:[" :","","* `bugFix` ","* `git checkout bugFix` `bugFix` (checkout).","* ","* `git checkout` `master` ","* ","* `git merge` `bugFix` `master` .","",'* , "help level" !*']}}]}}}}),e.define("/levels/intro/rebasing.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22bugFix%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout -b bugFix;git commit;git checkout master;git commit;git checkout bugFix;git rebase master",name:{en_US:"Rebase Introduction",fr_FR:"Introduction à rebase",ko:"(rebase) ",zh_CN:"(rebase)"},hint:{en_US:"Make sure you commit from bugFix first",fr_FR:"Assurez-vous de bien faire votre en premier votre commit sur bugFix",ko:"bugFix ",zh_CN:" bugFix "},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'The second way of combining work between branches is *rebasing.* Rebasing essentially takes a set of commits, "copies" them, and plops them down somewhere else.',"","While this sounds confusing, the advantage of rebasing is that it can be used to make a nice linear sequence of commits. The commit log / history of the repository will be a lot cleaner if only rebasing is allowed.","","Let's see it in action..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches yet again; note that the bugFix branch is currently selected (note the asterisk)","","We would like to move our work from bugFix directly onto the work from master. That way it would look like these two features were developed sequentially, when in reality they were developed in parallel.","","Let's do that with the `git rebase` command"],afterMarkdowns:["Awesome! Now the work from our bugFix branch is right on top of master and we have a nice linear sequence of commits.","",'Note that the commit C3 still exists somewhere (it has a faded appearance in the tree), and C3\' is the "copy" that we rebased onto master.',"","The only problem is that master hasn't been updated either, let's do that now..."],command:"git rebase master",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now we are checked out on the `master` branch. Let's do ahead and rebase onto `bugFix`..."],afterMarkdowns:["There! Since `master` was downstream of `bugFix`, git simply moved the `master` branch reference forward in history."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following","","* Checkout a new branch named `bugFix`","* Commit once","* Go back to master and commit again","* Check out bugFix again and rebase onto master","","Good luck!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'La seconde façon de combiner les contenus de deux branches est *rebase*. Rebase prend un enselble de commits, les "recopie", et les ajoute en bout de chaine à un autre endroit.',"","Bien que cela puisse sembler compliqué, l'avantage de rebase est de permettre d'obtenir une simple séquence linéeire de commits. Les logs/l'historique du dépôt seront bien plus propres si seul rebase est autorisé (plutôt que merge).","","Voyons rebase en action"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ici nous avons encore une fois deux branches; notez que nous sommes sur la branche bugFix (cf. l'asterisque)","","Nous voudrions transferer notre travail sur la branche 'bugFix' directement sur le travail dans 'master'. Ainsi on aurait l'impression que ces deux travaux ont été développés séquentiellement alors qu'en réalité ils ont été réalisés en parallèle.","","Faisons cela avec la commande `git rebase`"],afterMarkdowns:["Super! Désormais, le travail de la branche 'bugFix' est juste en haut de la branche 'master' et non avons une belle séquence linéaire de commits.","","Notez que le commit C3 existe toujours quelquepart (il est en grisé sur l'arbre), et C3' est la \"copie\" que nous avons créée sur master avec rebase.","","Le seul problème est que master n'a pas été mis à jour, faisons cela maintenant"],command:"git rebase master",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nous sommes désormais positionnés sur la branche `master`. Continuons en faisant le rebase sur `bugFix`","Et voilà ! Puisque `master` était un ascendant de `bugFix`, git a simplement déplacé la référence de la branche `master` en avant dans le temps."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"}},{type:"ModalAlert",options:{markdowns:["Pour acomplir ce niveau, faites les opérations suivantes","","* Positionnez-vous (checkout) sur une nouvelle branche nommée `bugFix`","* Faites un commit","* Retournez sur master et faites un nouveau commit","* Positionnez-vous à nouveau sur bugFix et faites un rebase sur master","","Bonne chance !"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",' *rebasing*"compies"',"","线使/","",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" bugFix",""," bugfix master 使",""," `git rebase`"],command:"git rebase master",afterMarkdowns:[" bugFix master 线","",' C3 C3\' master ""',""," master "],beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" `master` `bugFix` "],command:"git rebase bugFix",afterMarkdowns:[" `master` `bugFix` git `master` `bugFix` "],beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"}},{type:"ModalAlert",options:{markdowns:["","","* `bugFix` ","* ","* master ","* bugFix master ","",""]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git (Rebase)",""," *(rebase)*. , .",""," , . .",""," ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" ; bugFix ( )","","bugFix master . , , .","","`git rebase` ."],afterMarkdowns:["! bugFix master .","","C3 ( ), C3' master .","","master , ..."],command:"git rebase master",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" `master` . `bugFix` ..."],afterMarkdowns:["! `master` `bugFix` , ."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"}},{type:"ModalAlert",options:{markdowns:[" ","","* `bugFix` ","* ","* master ","* bugFix master ","","!"]}}]}}}}),e.define("/levels/rampup/detachedHead.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"C4","id":"HEAD"}}',solutionCommand:"git checkout C4",startTree:'{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}',name:{en_US:"Detach yo' HEAD"},hint:{en_US:"Use the label (hash) on the commit for help!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Moving around in Git","","Before we get to some of the more advanced features of Git, it's important to understand different ways to move through the commit tree that represents your project.","","Once you're comfortable moving around, your powers with other git commands will be amplified!","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","","First we have to talk about \"HEAD\". HEAD is the symbolic name for the currently checked out commit -- it's essentially what commit you're working on top of.","","HEAD always points to the most recent commit which is reflected in the working tree. Most git commands which make changes to the working tree will start by changing HEAD.","","Normally HEAD points to a branch name (like bugFix). When you commit, the status of bugFix is altered and this change is visible through HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see this in action. Here we will reveal HEAD before and after a commit."],afterMarkdowns:["See! HEAD was hiding underneath our `master` branch all along."],command:"git checkout C1; git checkout master; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Detaching HEAD","","Detaching HEAD just means attaching it to a commit instead of a branch. This is what it looks like beforehand:","","HEAD -> master -> C1",""],afterMarkdowns:["And now it's","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["To complete this level, let's detach HEAD from `bugFix` and attach it to the commit instead.","","Specify this commit by its hash. The hash for each commit is displayed on the circle that represents the commit."]}}]}}}}),e.define("/levels/rampup/relativeRefs.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"C3","id":"HEAD"}}',solutionCommand:"git checkout bugFix^",startTree:'{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}',name:{en_US:"Relative Refs (^)"},hint:{en_US:"Remember the Caret (^) operator!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Relative Refs","","Moving around in Git by specifying commit hashes can get a bit tedious. In the real world you won't have a nice commit tree visualization next to your terminal, so you'll have to use `git log` to see hashes.","","Furthermore, hashes are usually a lot longer in the real Git world as well. For instance, the hash of the commit that introduced the previous level is `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Doesn't exactly roll off the tongue...","","The upside is that Git is smart about hashes. It only requires you to specify enough characters of the hash until it uniquely identifies the commit. So I can type `fed2` instead of the long string above."]}},{type:"ModalAlert",options:{markdowns:["Like I said, specifying commits by their hash isn't the most convenient thing ever, which is why Git has relative refs. They are awesome!","","With relative refs, you can start somewhere memorable (like the branch `bugFix` or `HEAD`) and work from there.","","Relative commits are powerful, but we will introduce two simple ones here:","","* Moving upwards one commit at a time with `^`","* Moving upwards a number of times with `~<num>`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's look at the Caret (^) operator first. Each time you append that to a ref name, you are telling Git to find the parent of the specified commit.","",'So saying `master^` is equivalent to "the first parent of `master`".',"","`master^^` is the grandparent (second-generation ancestor) of `master`","","Let's check out the commit above master here"],afterMarkdowns:["Boom! Done. Way easier than typing the commit hash"],command:"git checkout master^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["You can also reference `HEAD` as a relative ref. Let's use that a couple of times to move upwards in the commit tree"],afterMarkdowns:["Easy! We can travel backwards in time with `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["To complete this level, check out the parent commit of `bugFix`. This will detach `HEAD`.","","You can specify the hash if you want, but try using relative refs instead!"]}}]}}}}),e.define("/levels/rampup/relativeRefs2.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C6","id":"master"},"bugFix":{"target":"C0","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"C1","id":"HEAD"}}',solutionCommand:"git branch -f master C6;git checkout HEAD~1;git branch -f bugFix HEAD~1",startTree:'{"branches":{"master":{"target":"C4","id":"master"},"bugFix":{"target":"C5","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"C2","id":"HEAD"}}',hint:{en_US:"You'll need to use at least one direct reference (hash) to complete this level"},name:{en_US:"Relative Refs #2 (~)"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:['### The "~" operator',"","Say you want to move a lot of levels up in the commit tree. It might be tedious to type `^` several times, so Git also has the tilde (~) operator.","","","The tilde operator (optionally) takes in a trailing number that specifies the number of parents you would like to ascend. Let's see it in action"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's specify a number of commits back with `~`."],afterMarkdowns:["Boom! So concise -- relative refs are great."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Branch forcing","","You're an expert on relative refs now, so let's actually *use* them for something.","","One of the most common ways I use relative refs is to move branches around. You can directly reassign a branch to a commit with the `-f` option. So something like:","","`git branch -f master HEAD~3`","","Moves (by force) the master branch to three parents behind HEAD."]}},{type:"ModalAlert",options:{markdowns:["To complete this level, move `HEAD`, `master`, and `bugFix` to their goal destinations shown."]}}]}}}}),e.define("/levels/rampup/reversingChanges.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%7D%2C%22pushed%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22pushed%22%7D%2C%22local%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22local%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22pushed%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git reset HEAD~1;git checkout pushed;git revert HEAD",compareOnlyBranches:!0,startTree:'{"branches":{"master":{"target":"C1","id":"master"},"pushed":{"target":"C2","id":"pushed"},"local":{"target":"C3","id":"local"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"local","id":"HEAD"}}',name:{en_US:"Reversing Changes in Git",fr_FR:"Annuler des changements avec Git",ko:"Git ",zh_CN:"Git "},hint:{en_US:"Notice that revert and reset take different arguments.",fr_FR:"",zh_CN:"",ko:""},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Reversing Changes in Git","","There are many ways to reverse changes in Git. And just like committing, reversing changes in Git has both a low-level component (staging individual files or chunks) and a high-level component (how the changes are actually reversed). Our application will focus on the latter.","","There are two primary ways to undo changes in Git -- one is using `git reset` and the other is using `git revert`. We will look at each of these in the next dialog",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` reverts changes by moving a branch reference backwards in time to an older commit. In this sense you can think of it as "rewriting history;" `git reset` will move a branch backwards as if the commit had never been made in the first place.',"","Let's see what that looks like:"],afterMarkdowns:["Nice! Git simply moved the master branch reference back to `C1`; now our local repository is in a state as if `C2` had never happened"],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'While reseting works great for local branches on your own machine, its method of "rewriting history" doesn\'t work for remote branches that others are using.',"","In order to reverse changes and *share* those reversed changes with others, we need to use `git revert`. Let's see it in action"],afterMarkdowns:["Weird, a new commit plopped down below the commit we wanted to reverse. That's because this new commit `C2'` introduces *changes* -- it just happens to introduce changes that exactly reverses the commit of `C2`.","","With reverting, you can push out your changes to share with others."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["To complete this level, reverse the two most recent commits on both `local` and `pushed`.","","Keep in mind that `pushed` is a remote branch and `local` is a local branch -- that should help you choose your methods."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Annuler des changements avec Git","","Il y a de nombreuses façons d'annuler des changement avec Git. De même que pour les commits, annuler des changements avec Git a à la fois un aspect bas-niveau (gestion dans le 'staging' des fichiers et morceaux de fichiers) et un aspect de plus haut niveau 9comment les changements sont effectivement annulés). Nous allons nous intéresser à ce dernier point.","","Il y a principalement deux façons d'annuler des changements avec Git -- l'une est `git reset` et l'autre est `git revert`. Nous allons maintenant voir chacune de ces façons",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","","`git reset` annule des changements en déplaçant la référence en arrière dans le temps sur un commit plus ancien. En ce sens, on peut considérer cela comme une façon de \"réécrire l'histoire\"; `git reset` fait remonter une branche en arrière comme si le(s) commit(s) n'avait jamais eu lieu.","","Regardons à quoi cela ressemble :"],afterMarkdowns:["Bravo ! Git a simplement déplacé la référence de la branche master en la faisant revenir sur `C1`; désormais notre dépôt est dans le même état que si `C2` n'avait jamais eu lieu"],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","Bien que le reset marche parfaitement pour les branches locales sur notre propre machine, cette façon de \"réécrire l'histoire\" ne marche pas avec les banches distantes (remote) que d'autres personnes utilisent.","","Pour pouvoir annuler des changements et *partager* ces annulations avec d'autres, nous devons utiliser `git revert`. Regardons comment cela fonctionne"],afterMarkdowns:["Étrangement, un nouveau commit est appaaru en bas sous le commit que nous voulions annuler. C'est parce que ce nouveau commit `C2'` introduit des *modifications* -- celles qui correspondent justement à l'annulation de celles du commit `C2`.","","Avec revert, vous pouvez diffuser (push) vos modifications et les partager avec tout le monde."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Pour accomplir ce niveau, annulez les deux derniers commits à la fois sur `local` et sur `pushed`.","","Ayez à l'esprit que `pushed` est une branche distante et `local` est une branche locale -- cela devrait vous guider dans le choix de la méthode à employer."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git ",""," Git reverse commit Git ",""," Git `git reset` `git revert`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` 退""`git reset` 退',"",""],command:"git reset HEAD~1",afterMarkdowns:["Nice! Git master `C1` `C2` "],beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","便","","** `git revert`"],command:"git revert HEAD",afterMarkdowns:[" `C2'` **introduces changes `C2` ",""," revert"],beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:[" `local` `pushed` ",""," `pushes` `local` "]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git ","","Git . ( ) ( ) , .","","Git -- `git reset` , `git revert` . .",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git (reset)","",'`git reset` . " " . , `git reset` .',""," :"],afterMarkdowns:[" master `C1` ; `C2` ."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git (revert)","",' (reset) , " " .',""," , ** , `git revert` . ."],afterMarkdowns:[", . `C2` ** , `C2` .",""," (push) ."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:[" , `local` `pushed` .","","`pushed` , `local` -- ?"]}}]}}}}),e.define("/levels/rebase/manyRebases.js",function(e,t,n,r,i,s,o){n.level={compareOnlyMasterHashAgnostic:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22bugFix%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C6%27%22%2C%22id%22%3A%22side%22%7D%2C%22another%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22another%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C7%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C7%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%2C%22C7%27%22%3A%7B%22parents%22%3A%5B%22C6%27%22%5D%2C%22id%22%3A%22C7%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout bugFix;git rebase master;git checkout side;git rebase bugFix;git checkout another;git rebase side;git rebase another master",startTree:'{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C3","id":"bugFix"},"side":{"target":"C6","id":"side"},"another":{"target":"C7","id":"another"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C0"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C5"],"id":"C7"}},"HEAD":{"target":"master","id":"HEAD"}}',name:{ko:"9 ",en_US:"Rebasing over 9000 times",zh_CN:""},hint:{en_US:"Remember, the most efficient way might be to only update master at the end...",ko:" master ...",zh_CN:"master"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebasing Multiple Branches","","Man, we have a lot of branches going on here! Let's rebase all the work from these branches onto master.","","Upper management is making this a bit trickier though -- they want the commits to all be in sequential order. So this means that our final tree should have `C7'` at the bottom, `C6'` above that, etc etc, etc all in order.","","If you mess up along the way, feel free to use `reset` to start over again. Be sure to check out our solution and see if you can do it in fewer commands!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["### ",""," master ","","upper management `C7'` `C6'` ",""," `reset` "]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["### (rebase) ","",", ! master ?",""," -- . `C7'` , `C6'` , .",""," , `reset` . , !"]}}]}}}}),e.define("/levels/rebase/selectiveRebase.js",function(e,t,n,r,i,s,o){n.level={compareAllBranchesHashAgnostic:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C5%22%2C%22id%22%3A%22master%22%7D%2C%22one%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22one%22%7D%2C%22two%22%3A%7B%22target%22%3A%22C2%27%27%22%2C%22id%22%3A%22two%22%7D%2C%22three%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22three%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C4%27%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C4%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C4%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22two%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout one; git cherry-pick C4 C3 C2; git checkout two; git cherry-pick C5 C4 C3 C2; git branch -f three C2",startTree:'{"branches":{"master":{"target":"C5","id":"master"},"one":{"target":"C1","id":"one"},"two":{"target":"C1","id":"two"},"three":{"target":"C1","id":"three"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"}},"HEAD":{"target":"master","id":"HEAD"}}',name:{ko:" ",en_US:"Branch Spaghetti",zh_CN:""},hint:{en_US:"Make sure to do everything in the proper order! Branch one first, then two, then three",ko:" ! (cherry-pick) , (rebase -i) ",zh_CN:" `one`, `two`, `three`"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch Spaghetti","","WOAHHHhhh Nelly! We have quite the goal to reach in this level.","","Here we have `master` that is a few commits ahead of branches `one` `two` and `three`. For whatever reason, we need to update these three other branches with modified versions of the last few commits on master.","","Branch `one` needs a re-ordering and a deletion of `C5`. `two` needs pure reordering, and `three` only needs one commit!","","We will let you figure out how to solve this one -- make sure to check out our solution afterwards with `show solution`. "]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch Spaghetti","","",""," `master` `one` `two` `three` master update these three other brances with modified versions of the last few commits on master",""," `one` `two` `three` ",""," `show solution` "]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## ","",", !",""," `master` `one`, `two`,`three` 3 . , master .","","`one` `C5` , `two` , `three` !",""," `show solution` ."]}}]}}}}),e.define("/levels/mixed/grabbingOneCommit.js",function(e,t,n,r,i,s,o){n.level={compareOnlyMasterHashAgnosticWithAsserts:!0,goalAsserts:{master:[function(e){return e.C4>e.C1}]},disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22master%22%7D%2C%22debug%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22debug%22%7D%2C%22printf%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22printf%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout master;git cherry-pick C4",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"debug":{"target":"C2","id":"debug"},"printf":{"target":"C3","id":"printf"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',name:{ko:" ",en_US:"Grabbing Just 1 Commit",zh_CN:""},hint:{en_US:"Remember, interactive rebase or cherry-pick is your friend here",ko:" (rebase -i) or (cherry-pick) ",zh_CN:" rebase cherry-pick "},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Locally stacked commits","","Here's a development situation that often happens: I'm trying to track down a bug but it is quite elusive. In order to aid in my detective work, I put in a few debug commands and a few print statements.","","All of these debugging / print statements are in their own branches. Finally I track down the bug, fix it, and rejoice!","","Only problem is that I now need to get my `bugFix` back into the `master` branch! I could simply fast-forward `master`, but then `master` would get all my debug statements."]}},{type:"ModalAlert",options:{markdowns:["This is where the magic of Git comes in. There are a few ways to do this, but the two most straightforward ways are:","","* `git rebase -i`","* `git cherry-pick`","","Interactive (the `-i`) rebasing allows you to choose which commits you want to keep or discard. It also allows you to reorder commits. This can be helpful if you want to toss out some work.","","Cherry-picking allows you to pick individual commits and plop them down on top of `HEAD`"]}},{type:"ModalAlert",options:{markdowns:["This is a later level so we will leave it up to you to decide, but in order to complete the level, make sure `master` receives the commit that `bugFix` references."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## (Locally stacked commits)",""," bug debug ",""," bug fix ",""," `bugFix` `master` fast-forward `master` `master` "]}},{type:"ModalAlert",options:{markdowns:[" Git ","","* `git rebase -i`","* `git cherry-pick`","","`-i`","","Cherry-picking `HEAD` "]}},{type:"ModalAlert",options:{markdowns:["便 `master` `bugFix` references"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## ",""," : , . ",""," . , !",""," `bugFix` `master` , . `master` (fast-forward) ."]}},{type:"ModalAlert",options:{markdowns:[" Git . , :","","* `git rebase -i`","* `git cherry-pick`",""," (-i ) (rebase) . . .","","(cherry-pick) `HEAD` ."]}},{type:"ModalAlert",options:{markdowns:[" , `master` `bugFix` ."]}}]}}}}),e.define("/levels/mixed/jugglingCommits.js",function(e,t,n,r,i,s,o){n.level={disabledMap:{"git cherry-pick":!0,"git revert":!0},compareOnlyMasterHashAgnosticWithAsserts:!0,goalAsserts:{master:[function(e){return e.C2>e.C3},function(e){return e.C2>e.C1}]},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22master%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C2%27%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i HEAD~2;git commit --amend;git rebase -i HEAD~2;git rebase caption master",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',name:{ko:" ",en_US:"Juggling Commits",zh_CN:""},hint:{en_US:"The first command is git rebase -i HEAD~2",ko:" git rebase -i HEAD~2 ",zh_CN:" 'git rebase -i HEAD~2'"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits","","Here's another situation that happens quite commonly. You have some changes (`newImage`) and another set of changes (`caption`) that are related, so they are stacked on top of each other in your repository (aka one after another).","","The tricky thing is that sometimes you need to make a small modification to an earlier commit. In this case, design wants us to change the dimensions of `newImage` slightly, even though that commit is way back in our history!!"]}},{type:"ModalAlert",options:{markdowns:["We will overcome this difficulty by doing the following:","","* We will re-order the commits so the one we want to change is on top with `git rebase -i`","* We will `commit --amend` to make the slight modification","* Then we will re-order the commits back to how they were previously with `git rebase -i`","* Finally, we will move master to this updated part of the tree to finish the level (via the method of your choosing)","","There are many ways to accomplish this overall goal (I see you eye-ing cherry-pick), and we will see more of them later, but for now let's focus on this technique."]}},{type:"ModalAlert",options:{markdowns:["Lastly, pay attention to the goal state here -- since we move the commits twice, they both get an apostrophe appended. One more apostrophe is added for the commit we amend, which gives us the final form of the tree ","","That being said, I can compare levels now based on structure and relative apostrophe differences. As long as your tree's `master` branch has the same structure and relative apostrophe differences, I'll give full credit"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## ",""," `newImage` `caption` stacked on top of each other in your repository",""," `newImage` change the dimensions slightly"]}},{type:"ModalAlert",options:{markdowns:["","","* `git rebase -i` ","* `commit --amend` ","* `git rebase -i` ","* master ",""," cherry-pick "]}},{type:"ModalAlert",options:{markdowns:[" both get an apostrophe appended"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## ",""," . `newImage` `caption` , .",""," . (history) `newImage` ."]}},{type:"ModalAlert",options:{markdowns:[" :","","* `git rebase -i` ","* `commit --amend` ","* `git rebase -i` ","* , master . ( )",""," ( ?), , ."]}},{type:"ModalAlert",options:{markdowns:[", -- , . (amend) ."]}}]}}}}),e.define("/levels/mixed/jugglingCommits2.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22master%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout master;git cherry-pick C2;git commit --amend;git cherry-pick C3",disabledMap:{"git revert":!0},startTree:'{"branches":{"master":{"target":"C1","id":"master"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',compareOnlyMasterHashAgnosticWithAsserts:!0,goalAsserts:{master:[function(e){return e.C2>e.C3},function(e){return e.C2>e.C1}]},name:{ko:" #2",en_US:"Juggling Commits #2",zh_CN:" #2"},hint:{en_US:"Don't forget to forward master to the updated changes!",ko:"master (forward) !",zh_CN:" master "},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits #2","","*If you haven't completed Juggling Commits #1 (the previous level), please do so before continuing*","","As you saw in the last level, we used `rebase -i` to reorder the commits. Once the commit we wanted to change was on top, we could easily --amend it and re-order back to our preferred order.","","The only issue here is that there is a lot of reordering going on, which can introduce rebase conflicts. Let's look at another method with `git cherry-pick`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Remember that git cherry-pick will plop down a commit from anywhere in the tree onto HEAD (as long as that commit isn't upstream).","","Here's a small refresher demo:"],afterMarkdowns:["Nice! Let's move on"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"ModalAlert",options:{markdowns:["So in this level, let's accomplish the same objective of amending `C2` once but avoid using `rebase -i`. I'll leave it up to you to figure it out! :D","","Remember, the exact number of apostrophe's (') on the commit are not important, only the relative differences. For example, I will give credit to a tree that matches the goal tree but has one extra apostrophe everywhere"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## #2","","* #1*","","使 `rebase -i` ","","rebase conflicts `git cherry-pick` "]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" cherry-pick HEAD ","",""],command:"git cherry-pick C2",afterMarkdowns:[""],beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"ModalAlert",options:{markdowns:[" `C2`使 `rebase -i` :D"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## #2","","* #1 , *",""," `rebase -i` . (top) --amend , .",""," , . `git cherry-pick` ."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["git cherry-pick HEAD ? (, )",""," :"],afterMarkdowns:["! "],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"ModalAlert",options:{markdowns:[" `C2` , `rebase -i` . ^.~"]}}]}}}}),e.define("/levels/advanced/multipleParents.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C7","id":"master"},"bugWork":{"target":"C2","id":"bugWork"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"master","id":"HEAD"}}',solutionCommand:"git branch bugWork master^^2^",startTree:'{"branches":{"master":{"target":"C7","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"master","id":"HEAD"}}',name:{en_US:"Multiple parents"},hint:{en_US:"Use `git branch bugWork` with a target commit to create the missing reference."},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["### Specifying Parents","","Like the `~` modifier, the `^` modifier also accepts an optional number after it.","","Rather than specifying the number of generations to go back (what `~` takes), the modifier on `^` specifies which parent reference to follow from a merge commit. Remember that merge commits have multiple parents, so the path to choose is ambiguous.","",'Git will normally follow the "first" parent upwards from a merge commit, but specifying a number with `^` changes this default behavior.',"","Enough talking, let's see it in action.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have a merge commit. If we checkout `master^` without the modifier, we will follow the first parent after the merge commit. ","","(*In our visuals, the first parent is positioned directly above the merge commit.*)"],afterMarkdowns:["Easy -- this is what we are all used to."],command:"git checkout master^",beforeCommand:"git checkout HEAD^; git commit; git checkout master; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now let's try specifying the second parent instead..."],afterMarkdowns:["See? We followed the other parent upwards."],command:"git checkout master^2",beforeCommand:"git checkout HEAD^; git commit; git checkout master; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["The `^` and `~` modifiers can make moving around a commit tree very powerful:"],afterMarkdowns:["Lightning fast!"],command:"git checkout HEAD~; git checkout HEAD^2; git checkout HEAD~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Even crazier, these modifiers can be chained together! Check this out:"],afterMarkdowns:["The same movement as before, but all in one command."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Put it to practice","","To complete this level, create a new branch at the specified destination.","","Obviously it would be easy to specify the commit directly (with something like `C6`), but I challenge you to use the modifiers we talked about instead!"]}}]}}}}),e.define("/src/js/views/levelDropdownView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../intl"),h=e("../util/keyboard").KeyboardListener,p=e("../app"),d=e("../views").ModalTerminal,v=e("../views").ContainedBase,m=e("../views").BaseView,g=v.extend({tagName:"div",className:"levelDropdownView box vertical",template:u.template($("#level-dropdown-view").html()),initialize:function(e){e=e||{},this.JSON={},this.navEvents=u.clone(f.Events),this.navEvents.on("clickedID",u.debounce(u.bind(this.loadLevelID,this),300,!0)),this.navEvents.on("negative",this.negative,this),this.navEvents.on("positive",this.positive,this),this.navEvents.on("left",this.left,this),this.navEvents.on("right",this.right,this),this.navEvents.on("up",this.up,this),this.navEvents.on("down",this.down,this),this.keyboardListener=new h({events:this.navEvents,aliasMap:{esc:"negative",enter:"positive"},wait:!0}),this.sequences=p.getLevelArbiter().getSequences(),this.sequenceToLevels=p.getLevelArbiter().getSequenceToLevels(),this.container=new d({title:c.str("select-a-level")}),this.render(),p.getEvents().on("resetMapSolved",this.render,this),p.getEvents().on("localeChanged",this.render,this),e.wait||this.show()},render:function(){g.__super__.render.apply(this,arguments),this.buildSequences()},positive:function(){if(!this.selectedID)return;this.loadLevelID(this.selectedID)},left:function(){if(this.turnOnKeyboardSelection())return;this.leftOrRight(-1)},leftOrRight:function(e){this.deselectIconByID(this.selectedID),this.selectedIndex=this.wrapIndex(this.selectedIndex+e,this.getCurrentSequence()),this.selectedID=this.getSelectedID(),this.selectIconByID(this.selectedID)},right:function(){if(this.turnOnKeyboardSelection())return;this.leftOrRight(1)},up:function(){if(this.turnOnKeyboardSelection())return;this.selectedSequence=this.getPreviousSequence(),this.downOrUp()},down:function(){if(this.turnOnKeyboardSelection())return;this.selectedSequence=this.getNextSequence(),this.downOrUp()},downOrUp:function(){this.selectedIndex=this.boundIndex(this.selectedIndex,this.getCurrentSequence()),this.deselectIconByID(this.selectedID),this.selectedID=this.getSelectedID(),this.selectIconByID(this.selectedID)},turnOnKeyboardSelection:function(){return this.selectedID?!1:(this.selectFirst(),!0)},turnOffKeyboardSelection:function(){if(!this.selectedID)return;this.deselectIconByID(this.selectedID),this.selectedID=undefined,this.selectedIndex=undefined,this.selectedSequence=undefined},wrapIndex:function(e,t){return e=e>=t.length?0:e,e=e<0?t.length-1:e,e},boundIndex:function(e,t){return e=e>=t.length?t.length-1:e,e=e<0?0:e,e},getNextSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e+1,this.sequences);return this.sequences[t]},getPreviousSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e-1,this.sequences);return this.sequences[t]},getSequenceIndex:function(e){var t=this.sequences.indexOf(e);if(t<0)throw new Error("didnt find");return t},getIndexForID:function(e){return p.getLevelArbiter().getLevel(e).index},selectFirst:function(){var e=this.sequenceToLevels[this.sequences[0]][0].id;this.selectIconByID(e),this.selectedIndex=0,this.selectedSequence=this.sequences[0]},getCurrentSequence:function(){return this.sequenceToLevels[this.selectedSequence]},getSelectedID:function(){return this.sequenceToLevels[this.selectedSequence][this.selectedIndex].id},selectIconByID:function(e){this.toggleIconSelect(e,!0)},deselectIconByID:function(e){this.toggleIconSelect(e,!1)},toggleIconSelect:function(e,t){this.selectedID=e;var n="#levelIcon-"+e;$(n).toggleClass("selected",t)},negative:function(){this.hide()},testOption:function(e){return this.currentCommand&&(new RegExp("--"+e)).test(this.currentCommand.get("rawStr"))},show:function(e,t){this.currentCommand=t,this.updateSolvedStatus(),this.showDeferred=e,this.keyboardListener.listen(),g.__super__.show.apply(this)},hide:function(){this.showDeferred&&this.showDeferred.resolve(),this.showDeferred=undefined,this.keyboardListener.mute(),this.turnOffKeyboardSelection(),g.__super__.hide.apply(this)},loadLevelID:function(e){this.testOption("noOutput")||p.getEventBaton().trigger("commandSubmitted","level "+e),this.hide()},updateSolvedStatus:function(){u.each(this.seriesViews,function(e){e.updateSolvedStatus()},this)},buildSequences:function(){this.seriesViews=[],u.each(this.sequences,function(e){this.seriesViews.push(new y({destination:this.$el,name:e,navEvents:this.navEvents}))},this)}}),y=m.extend({tagName:"div",className:"seriesView box flex1 vertical",template:u.template($("#series-view").html()),events:{"click div.levelIcon":"click","mouseenter div.levelIcon":"enterIcon","mouseleave div.levelIcon":"leaveIcon"},initialize:function(e){this.name=e.name||"intro",this.navEvents=e.navEvents,this.info=p.getLevelArbiter().getSequenceInfo(this.name),this.levels=p.getLevelArbiter().getLevelsInSequence(this.name),this.levelIDs=[],u.each(this.levels,function(e){this.levelIDs.push(e.id)},this),this.destination=e.destination,this.JSON={displayName:c.getIntlKey(this.info,"displayName"),about:c.getIntlKey(this.info,"about"),ids:this.levelIDs},this.render(),this.updateSolvedStatus()},updateSolvedStatus:function(){var e=this.$("div.levelIcon").each(function(e,t){var n=$(t).attr("data-id");$(t).toggleClass("solved",p.getLevelArbiter().isLevelSolved(n))})},getEventID:function(e){var t=e.target;return $(t).attr("data-id")},resetAbout:function(){this.$("p.about").text(c.getIntlKey(this.info,"about")).css("font-style","inherit")},setAbout:function(e){this.$("p.about").text(e).css("font-style","italic")},enterIcon:function(e){var t=this.getEventID(e),n=p.getLevelArbiter().getLevel(t);this.setAbout(c.getName(n))},leaveIcon:function(){this.resetAbout()},click:function(e){var t=this.getEventID(e);this.navEvents.trigger("clickedID",t)}});n.LevelDropdownView=g}),e.define("/src/js/views/commandViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections").CommandEntryCollection,l=e("../app"),c=e("../models/commandModel").Command,h=e("../models/commandModel").CommandEntry,p=e("../util/errors"),d=p.Warning,v=e("../util"),m=e("../util/keyboard"),g=a.View.extend({initialize:function(e){l.getEvents().on("commandSubmittedPassive",this.addToCommandHistory,this),this.commands=new f,this.commands.fetch({success:u.bind(function(){var e=[];this.commands.each(function(t){e.push(t)}),e.reverse(),this.commands.reset(),u.each(e,function(e){this.commands.add(e)},this)},this)}),this.index=-1,this.commandParagraph=this.$("#prompt p.command")[0],this.commandCursor=this.$("#prompt span.cursor")[0],this.focus(),l.getEvents().on("rollupCommands",this.rollupCommands,this),l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this)},events:{"blur #commandTextField":"hideCursor","focus #commandTextField":"showCursor"},blur:function(){this.hideCursor()},focus:function(){this.$("#commandTextField").focus(),this.showCursor()},hideCursor:function(){this.toggleCursor(!1)},showCursor:function(){this.toggleCursor(!0)},toggleCursor:function(e){$(this.commandCursor).toggleClass("shown",e)},onKeyDown:function(e){var t=e.target;this.updatePrompt(t)},onKeyUp:function(e){this.onKeyDown(e);var t={enter:u.bind(function(){this.submit()},this),up:u.bind(function(){this.commandSelectChange(1)},this),down:u.bind(function(){this.commandSelectChange(-1)},this)},n=m.mapKeycodeToKey(e.which||e.keyCode);t[n]!==undefined&&(e.preventDefault(),t[n](),this.onKeyDown(e))},badHtmlEncode:function(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/</g,"&lt;").replace(/ /g,"&nbsp;").replace(/\n/g,"")},updatePrompt:function(e){e=e||{};var t=$("#commandTextField").val(),n=this.badHtmlEncode(t);this.commandParagraph.innerHTML=n,this.cursorUpdate(t.length,e.selectionStart,e.selectionEnd),l.getEvents().trigger("commandScrollDown")},cursorUpdate:function(t,n,r){if(n===undefined||r===undefined)n=Math.max(t-1,0),r=t;var i=e("../util/zoomLevel").detectZoom(),s=10*i,o=22*i,u=$(this.commandParagraph).width(),a=u/s,f=Math.min(Math.max(1,r-n),a),l=String(f*s)+"px",c=String(s*(n%a))+"px",h=String(Math.floor(n/a)*o)+"px";$(this.commandCursor).css({width:l,left:c,top:h})},commandSelectChange:function(e){this.index+=e;if(this.index>=this.commands.length||this.index<0){this.clear(),this.index=-1;return}var t=this.commands.toArray()[this.index].get("text");this.setTextField(t)},clearLocalStorage:function(){this.commands.each(function(e){a.sync("delete",e,function(){})},this)},setTextField:function(e){this.$("#commandTextField").val(e)},clear:function(){this.setTextField("")},submit:function(){var e=this.$("#commandTextField").val().replace("\n","");this.clear(),this.submitCommand(e),this.index=-1},rollupCommands:function(e){var t=this.commands.toArray().slice(1,Number(e)+1);t.reverse();var n="";u.each(t,function(e){n+=e.get("text")+";"},this);var r=new h({text:n});this.commands.unshift(r),a.sync("create",r,function(){})},addToCommandHistory:function(e){var t=e.length&&this.index===-1||e.length&&this.index!==-1&&this.commands.toArray()[this.index].get("text")!==e;if(!t)return;var n=new h({text:e});this.commands.unshift(n),a.sync("create",n,function(){}),this.commands.length>100&&this.clearLocalStorage()},submitCommand:function(e){l.getEventBaton().trigger("commandSubmitted",e)}}),y=a.View.extend({tagName:"div",model:c,template:u.template($("#command-template").html()),events:{click:"clicked"},clicked:function(e){},initialize:function(){this.model.bind("change",this.wasChanged,this),this.model.bind("destroy",this.remove,this)},wasChanged:function(e,t){var n=t.changes,r=u.keys(n);u.difference(r,["status"]).length===0?this.updateStatus():this.render()},updateStatus:function(){var e=["inqueue","processing","finished"],t={};u.each(e,function(e){t[e]=!1}),t[this.model.get("status")]=!0;var n=this.$("p.commandLine");u.each(t,function(e,t){n.toggleClass(t,e)})},render:function(){var e=u.extend({resultType:"",result:"",formattedWarnings:this.model.getFormattedWarnings()},this.model.toJSON());return this.$el.html(this.template(e)),this},remove:function(){$(this.el).hide()}}),b=a.View.extend({initialize:function(e){this.collection=e.collection,this.collection.on("add",this.addOne,this),this.collection.on("reset",this.addAll,this),this.collection.on("all",this.render,this),this.collection.on("change",this.scrollDown,this),l.getEvents().on("commandScrollDown",this.scrollDown,this),l.getEvents().on("clearOldCommands",this.clearOldCommands,this)},addWarning:function(e){var t=new d({msg:e}),n=new c({error:t,rawStr:"Warning:"});this.collection.add(n)},clearOldCommands:function(){var e=[];this.collection.each(function(t){t.get("status")!=="inqueue"&&t.get("status")!=="processing"&&e.push(t)},this),u.each(e,function(e){e.destroy()},this),this.scrollDown()},scrollDown:function(){var e=$("#commandDisplay")[0],t=$("#terminal")[0],n=e.clientHeight>t.clientHeight||$(window).height()<e.clientHeight;$(t).toggleClass("scrolling",n),n&&(t.scrollTop=t.scrollHeight)},addOne:function(e){var t=new y({model:e});this.$("#commandDisplay").append(t.render().el),this.scrollDown()},addAll:function(){this.collection.each(this.addOne)}});n.CommandPromptView=g,n.CommandLineHistoryView=b}),e.define("/src/js/util/zoomLevel.js",function(e,t,n,r,i,s,o){function f(){return!window.outerWidth||!window.innerWidth?(a&&(console.warn("Can't detect zoom level correctly :-/"),a=!1),1):window.outerWidth/window.innerWidth}var u=e("underscore"),a=!0,l=!0,c=function(e,t){var n=0;setInterval(function(){var r=f();if(r!==n){if(l){l=!1;return}n=r,e.apply(t,[r])}else l=!0},500)};n.setupZoomPoll=c,n.detectZoom=f}),e.define("/src/js/dialogs/sandbox.js",function(e,t,n,r,i,s,o){n.dialog={en_US:[{type:"ModalAlert",options:{markdowns:["## Welcome to LearnGitBranching!","","This application is designed to help beginners grasp ","the powerful concepts behind branching when working ","with git. We hope you enjoy this application and maybe ","even learn something!","","# Demo!","","If you have not seen the demo, please check it out here:","","[http://pcottle.github.com/learnGitBranching/?demo](http://pcottle.github.com/learnGitBranching/?demo)","","Annoyed at this dialog? Append `?NODEMO` to the url to get rid of it, linked below for convenience:","","[http://pcottle.github.com/learnGitBranching/?NODEMO](?NODEMO)"]}},{type:"ModalAlert",options:{markdowns:["## Git commands","","You have a large variety of git commands available in sandbox mode. These include",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## Sharing is caring!","","Share trees with your friends via `export tree` and `import tree`","","Have a great lesson to share? Try building a level with `build level` or try out a friend's level with `import level`","","To see the full range of commands, try `show commands`. There are some gems like `undo` and `reset`","","For now let's get you started on the `levels`..."]}}],zh_CN:[{type:"ModalAlert",options:{markdowns:["## LearnGitBranching!",""," git ","","","# !","","","","[http://pcottle.github.com/learnGitBranching/?demo](http://pcottle.github.com/learnGitBranching/?demo)",""," URL `?NODEMO` ","","[http://pcottle.github.com/learnGitBranching/?NODEMO](http://pcottle.github.com/learnGitBranching/?NODEMO)"]}},{type:"ModalAlert",options:{markdowns:["## Git ",""," ",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## 怀","","使 `export tree` `import tree` Git ",""," `build level` `import level` ",""," `levels` "]}}],ko:[{type:"ModalAlert",options:{markdowns:["## Git !",""," git "," . ",", !",""," [Peter Cottle](https://github.com/pcottle) [LearnGitBranching](http://pcottle.github.com/learnGitBranching/) ."," .","","<http://pcottle.github.com/learnGitBranching/?demo&locale=ko>"]}},{type:"ModalAlert",options:{markdowns:["## Git ",""," git ",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## !","","`export tree` `import tree` ",""," ? `build level` , `import level` ",""," ..."]}}]}}),e.define("/src/js/util/mock.js",function(e,t,n,r,i,s,o){n.mock=function(e){var t={},n=function(){};for(var r in e.prototype)t[r]=n;return t}}),e.define("sys",function(e,t,n,r,i,s,o){t.exports=e("util")}),e.define("child_process",function(e,t,n,r,i,s,o){n.spawn=function(){},n.exec=function(){}}),e.define("/src/js/visuals/tree.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e.define("/src/js/git/headless.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("q"),l=e("../git").GitEngine,c=e("../visuals/animation/animationFactory").AnimationFactory,h=e("../visuals").GitVisuals,p=e("../git/treeCompare").TreeCompare,d=e("../util/eventBaton").EventBaton,v=e("../models/collections"),m=v.CommitCollection,g=v.BranchCollection,y=e("../models/commandModel").Command,b=e("../util/mock").mock,w=e("../util"),E=function(){this.init()};E.prototype.init=function(){this.commitCollection=new m,this.branchCollection=new g,this.treeCompare=new p;var e=b(c),t=b(h);this.gitEngine=new l({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:t,animationFactory:e,eventBaton:new d}),this.gitEngine.init()},E.prototype.sendCommand=function(e){w.splitTextCommand(e,function(e){var t=new y({rawStr:e});this.gitEngine.dispatch(t,f.defer())},this)},n.HeadlessGit=E}),e.define("/src/js/app/index.js",function(e,t,n,r,i,s,o){function E(){var t=e("../views"),n=e("../models/collections"),r=e("../views/commandViews"),i=new t.MainHelperBar;this.commandCollection=new n.CommandCollection,this.commandBuffer=new n.CommandBuffer({collection:this.commandCollection}),this.commandPromptView=new r.CommandPromptView({el:$("#commandLineBar")}),this.commandLineHistoryView=new r.CommandLineHistoryView({el:$("#commandLineHistory"),collection:this.commandCollection})}var u=e("underscore"),a=e("backbone"),f=e("../util/constants"),l=e("../util"),c=u.clone(a.Events),h,p,d,v,m,g=function(){var t=e("../level/sandbox").Sandbox,n=e("../level").Level,r=e("../util/eventBaton").EventBaton,i=e("../level/arbiter").LevelArbiter,s=e("../views/levelDropdownView").LevelDropdownView;d=new r,h=new E,p=new t,v=new i,m=new s({wait:!0}),c.on("localeChanged",y),b(d),w(p)},y=function(){if(!window.$)return;$("span.intl-aware").each(function(t,n){var r=e("../intl"),i=$(n).attr("data-intl");$(n).text(r.str(i).toUpperCase())})},b=function(e){var t=function(){$("#commandTextField").focus()};t(),$(window).focus(function(t){e.trigger("windowFocus",t)}),$(document).click(function(t){e.trigger("documentClick",t)}),$(document).bind("keydown",function(t){e.trigger("docKeydown",t)}),$(document).bind("keyup",function(t){e.trigger("docKeyup",t)}),$(window).on("resize",function(e){c.trigger("resize",e)}),e.stealBaton("docKeydown",function(){}),e.stealBaton("docKeyup",function(){}),e.stealBaton("windowFocus",t),e.stealBaton("documentClick",t);var n=function(t){return function(){var n=[t];u.each(arguments,function(e){n.push(e)}),e.trigger.apply(e,n)}};$("#commandTextField").on("keydown",n("keydown")),$("#commandTextField").on("keyup",n("keyup")),$(window).trigger("resize")},w=function(e){var t=l.parseQueryString(window.location.href);t.hasOwnProperty("demo")?e.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git commit; git checkout -b bugFix C1; git commit; git merge master; git checkout master; git commit; git rebase bugFix;","delay 1000; reset;","level rebase1 --noFinishDialog --noStartCommand --noIntroDialog;","delay 2000; show goal; delay 1000; hide goal;","git checkout bugFix; git rebase master; git checkout side; git rebase bugFix;","git checkout another; git rebase side; git rebase another master;","help; levels"].join(""))}):t.hasOwnProperty("NODEMO")||e.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",["git help;","delay 1000;","help;","levels"].join(""))}),t.locale!==undefined&&t.locale.length&&(f.GLOBAL.locale=t.locale,c.trigger("localeChanged"));if(t.command){var n=unescape(t.command);e.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted",n)})}(/(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent)||/android/i.test(navigator.userAgent))&&e.mainVis.customEvents.on("gitEngineReady",function(){d.trigger("commandSubmitted","mobile alert")})};e("../util").isBrowser()&&$(document).ready(g),n.getEvents=function(){return c},n.getSandbox=function(){return p},n.getEventBaton=function(){return d},n.getCommandUI=function(){return h},n.getLevelArbiter=function(){return v},n.getLevelDropdown=function(){return m},n.init=g}),e("/src/js/app/index.js"),e.define("/src/js/dialogs/confirmShowSolution.js",function(e,t,n,r,i,s,o){n.dialog={en_US:[{type:"ModalAlert",options:{markdowns:["## Are you sure you want to see the solution?","","I believe in you! You can do it"]}}],zh_CN:[{type:"ModalAlert",options:{markdowns:["## ","",""]}}]}}),e("/src/js/dialogs/confirmShowSolution.js"),e.define("/src/js/dialogs/levelBuilder.js",function(e,t,n,r,i,s,o){n.dialog={en_US:[{type:"ModalAlert",options:{markdowns:["## Welcome to the level builder!","","Here are the main steps:",""," * Set up the initial environment with git commands"," * Define the starting tree with ```define start```"," * Enter the series of git commands that compose the (optimal) solution"," * Define the goal tree with ```define goal```. Defining the goal also defines the solution"," * Optionally define a hint with ```define hint```"," * Edit the name with ```define name```"," * Optionally define a nice start dialog with ```edit dialog```"," * Enter the command ```finish``` to output your level JSON!"]}}],zh_CN:[{type:"ModalAlert",options:{markdowns:["## 使","","",""," * 使 git "," * 使 ```define start``` "," * git "," * 使 ```define goal``` "," * ```define hint``` "," * ```define name``` "," * ```edit dialog``` "," * ```finish``` JSON"]}}]}}),e("/src/js/dialogs/levelBuilder.js"),e.define("/src/js/dialogs/nextLevel.js",function(e,t,n,r,i,s,o){n.dialog={en_US:[{type:"ModalAlert",options:{markdowns:["## Great Job!!","","You solved the level in *{numCommands}* command(s); ","our solution uses {best}."]}}],zh_CN:[{type:"ModalAlert",options:{markdowns:["## ",""," *{numCommands}* {best}"]}}]}}),e("/src/js/dialogs/nextLevel.js"),e.define("/src/js/dialogs/sandbox.js",function(e,t,n,r,i,s,o){n.dialog={en_US:[{type:"ModalAlert",options:{markdowns:["## Welcome to LearnGitBranching!","","This application is designed to help beginners grasp ","the powerful concepts behind branching when working ","with git. We hope you enjoy this application and maybe ","even learn something!","","# Demo!","","If you have not seen the demo, please check it out here:","","[http://pcottle.github.com/learnGitBranching/?demo](http://pcottle.github.com/learnGitBranching/?demo)","","Annoyed at this dialog? Append `?NODEMO` to the url to get rid of it, linked below for convenience:","","[http://pcottle.github.com/learnGitBranching/?NODEMO](?NODEMO)"]}},{type:"ModalAlert",options:{markdowns:["## Git commands","","You have a large variety of git commands available in sandbox mode. These include",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## Sharing is caring!","","Share trees with your friends via `export tree` and `import tree`","","Have a great lesson to share? Try building a level with `build level` or try out a friend's level with `import level`","","To see the full range of commands, try `show commands`. There are some gems like `undo` and `reset`","","For now let's get you started on the `levels`..."]}}],zh_CN:[{type:"ModalAlert",options:{markdowns:["## LearnGitBranching!",""," git ","","","# !","","","","[http://pcottle.github.com/learnGitBranching/?demo](http://pcottle.github.com/learnGitBranching/?demo)",""," URL `?NODEMO` ","","[http://pcottle.github.com/learnGitBranching/?NODEMO](http://pcottle.github.com/learnGitBranching/?NODEMO)"]}},{type:"ModalAlert",options:{markdowns:["## Git ",""," ",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## 怀","","使 `export tree` `import tree` Git ",""," `build level` `import level` ",""," `levels` "]}}],ko:[{type:"ModalAlert",options:{markdowns:["## Git !",""," git "," . ",", !",""," [Peter Cottle](https://github.com/pcottle) [LearnGitBranching](http://pcottle.github.com/learnGitBranching/) ."," .","","<http://pcottle.github.com/learnGitBranching/?demo&locale=ko>"]}},{type:"ModalAlert",options:{markdowns:["## Git ",""," git ",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## !","","`export tree` `import tree` ",""," ? `build level` , `import level` ",""," ..."]}}]}}),e("/src/js/dialogs/sandbox.js"),e.define("/src/js/git/commands.js",function(e,t,n,r,i,s,o){function y(e,t){this.method=e,this.rawOptions=t,this.supportedMap=this.getMasterOptionMap()[e];if(this.supportedMap===undefined)throw new Error("No option map for "+e);this.generalArgs=[],this.explodeAndSet()}var u=e("underscore"),a=e("../intl"),f=e("../util/errors"),l=f.CommandProcessError,c=f.GitError,h=f.Warning,p=f.CommandResult,d={"git commit":/^(gc|git ci)($|\s)/,"git add":/^ga($|\s)/,"git checkout":/^(go|git co)($|\s)/,"git rebase":/^gr($|\s)/,"git branch":/^(gb|git br)($|\s)/,"git status":/^(gst|gs|git st)($|\s)/,"git help":/^git$/},v=[[/^git help($|\s)/,function(){var e=[a.str("git-version"),"<br/>",a.str("git-usage"),u.escape(a.str("git-usage-command")),"<br/>",a.str("git-supported-commands"),"<br/>"],t=y.prototype.getMasterOptionMap();u.each(t,function(t,n){e.push("git "+n),u.each(t,function(t,n){e.push(" "+n)},this)},this);var n=e.join("\n");throw n=n.replace(/\t/g,"&nbsp;&nbsp;&nbsp;"),new p({msg:n})}]],m={"git commit":/^git +commit($|\s)/,"git add":/^git +add($|\s)/,"git checkout":/^git +checkout($|\s)/,"git rebase":/^git +rebase($|\s)/,"git reset":/^git +reset($|\s)/,"git branch":/^git +branch($|\s)/,"git revert":/^git +revert($|\s)/,"git log":/^git +log($|\s)/,"git merge":/^git +merge($|\s)/,"git show":/^git +show($|\s)/,"git status":/^git +status($|\s)/,"git cherry-pick":/^git +cherry-pick($|\s)/},g=function(e){var t,n;u.each(m,function(r,i){r.exec(e)&&(n=e.slice(i.length+1),t=i.slice("git ".length))});if(!t)return!1;var r=new y(t,n);return{toSet:{generalArgs:r.generalArgs,supportedMap:r.supportedMap,method:t,options:n,eventName:"processGitCommand"}}};y.prototype.getMasterOptionMap=function(){return{commit:{"--amend":!1,"-a":!1,"-am":!1,"-m":!1},status:{},log:{},add:{},"cherry-pick":{},branch:{"-d":!1,"-D":!1,"-f":!1,"--contains":!1},checkout:{"-b":!1,"-B":!1,"-":!1},reset:{"--hard":!1,"--soft":!1},merge:{},rebase:{"-i":!1},revert:{},show:{}}},y.prototype.explodeAndSet=function(){var e=this.rawOptions.match(/('.*?'|".*?"|\S+)/g)||[];for(var t=0;t<e.length;t++){var n=e[t];if(n.slice(0,1)=="-"){if(this.supportedMap[n]===undefined)throw new l({msg:a.str("option-not-supported",{option:n})});var r=[],i=t+1;while(i<e.length&&e[i].slice(0,1)!="-")r.push(e[i]),i+=1;t=i-1,this.supportedMap[n]=r}else this.generalArgs.push(n)}},n.shortcutMap=d,n.instantCommands=v,n.parse=g,n.regexMap=m}),e("/src/js/git/commands.js"),e.define("/src/js/git/gitShim.js",function(e,t,n,r,i,s,o){function c(e){e=e||{},this.beforeCB=e.beforeCB||function(){},this.afterCB=e.afterCB||function(){};var t=function(e){e.resolve()};this.beforeDeferHandler=e.beforeDeferHandler||t,this.afterDeferHandler=e.afterDeferHandler||t,this.eventBaton=e.eventBaton||f.getEventBaton()}var u=e("underscore"),a=e("q"),f=e("../app"),l=e("../views/multiView").MultiView;c.prototype.insertShim=function(){this.eventBaton.stealBaton("processGitCommand",this.processGitCommand,this)},c.prototype.removeShim=function(){this.eventBaton.releaseBaton("processGitCommand",this.processGitCommand,this)},c.prototype.processGitCommand=function(e,t){this.beforeCB(e);var n=a.defer();n.promise.then(u.bind(function(){this.afterGitCommandProcessed(e,t)},this)).done();var r=u.bind(function(){this.eventBaton.passBatonBack("processGitCommand",this.processGitCommand,this,[e,n])},this),i=a.defer();i.promise.then(r).done(),this.beforeDeferHandler(i,e)},c.prototype.afterGitCommandProcessed=function(e,t){this.afterCB(e);var n=a.defer();n.promise.then(function(){t.resolve()}).done(),this.afterDeferHandler(n,e)},n.GitShim=c}),e("/src/js/git/gitShim.js"),e.define("/src/js/git/headless.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("q"),l=e("../git").GitEngine,c=e("../visuals/animation/animationFactory").AnimationFactory,h=e("../visuals").GitVisuals,p=e("../git/treeCompare").TreeCompare,d=e("../util/eventBaton").EventBaton,v=e("../models/collections"),m=v.CommitCollection,g=v.BranchCollection,y=e("../models/commandModel").Command,b=e("../util/mock").mock,w=e("../util"),E=function(){this.init()};E.prototype.init=function(){this.commitCollection=new m,this.branchCollection=new g,this.treeCompare=new p;var e=b(c),t=b(h);this.gitEngine=new l({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:t,animationFactory:e,eventBaton:new d}),this.gitEngine.init()},E.prototype.sendCommand=function(e){w.splitTextCommand(e,function(e){var t=new y({rawStr:e});this.gitEngine.dispatch(t,f.defer())},this)},n.HeadlessGit=E}),e("/src/js/git/headless.js"),e.define("/src/js/git/index.js",function(e,t,n,r,i,s,o){function g(e){this.rootCommit=null,this.refs={},this.HEAD=null,this.branchCollection=e.branches,this.commitCollection=e.collection,this.gitVisuals=e.gitVisuals,this.eventBaton=e.eventBaton,this.eventBaton.stealBaton("processGitCommand",this.dispatch,this),this.animationFactory=e.animationFactory||new c.AnimationFactory,this.commandOptions={},this.generalArgs=[],this.initUniqueID()}var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("q"),l=e("../intl"),c=e("../visuals/animation/animationFactory"),h=e("../visuals/animation").AnimationQueue,p=e("./treeCompare").TreeCompare,d=e("../util/errors"),v=d.GitError,m=d.CommandResult;g.prototype.initUniqueID=function(){this.uniqueId=function(){var e=0;return function(t){return t?t+e++:e++}}()},g.prototype.defaultInit=function(){var e=JSON.parse(unescape("%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%2C%22type%22%3A%22branch%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%22C0%22%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C1%22%7D%7D%2C%22HEAD%22%3A%7B%22id%22%3A%22HEAD%22%2C%22target%22%3A%22master%22%2C%22type%22%3A%22general%20ref%22%7D%7D"));this.loadTree(e)},g.prototype.init=function(){this.rootCommit=this.makeCommit(null,null,{rootCommit:!0}),this.commitCollection.add(this.rootCommit);var e=this.makeBranch("master",this.rootCommit);this.HEAD=new y({id:"HEAD",target:e}),this.refs[this.HEAD.get("id")]=this.HEAD,this.commit()},g.prototype.exportTree=function(){var e={branches:{},commits:{},HEAD:null};u.each(this.branchCollection.toJSON(),function(t){t.target=t.target.get("id"),t.visBranch=undefined,e.branches[t.id]=t}),u.each(this.commitCollection.toJSON(),function(t){u.each(w.prototype.constants.circularFields,function(e){t[e]=undefined},this);var n=[];u.each(t.parents,function(e){n.push(e.get("id"))}),t.parents=n,e.commits[t.id]=t},this);var t=this.HEAD.toJSON();return t.visBranch=undefined,t.lastTarget=t.lastLastTarget=t.visBranch=undefined,t.target=t.target.get("id"),e.HEAD=t,e},g.prototype.printTree=function(e){e=e||this.exportTree(),p.prototype.reduceTreeFields([e]);var t=JSON.stringify(e);return/'/.test(t)&&(t=escape(t)),t},g.prototype.printAndCopyTree=function(){window.prompt(l.str("Copy the tree string below"),this.printTree())},g.prototype.loadTree=function(e){e=$.extend(!0,{},e),this.removeAll(),this.instantiateFromTree(e),this.reloadGraphics(),this.initUniqueID()},g.prototype.loadTreeFromString=function(e){this.loadTree(JSON.parse(unescape(e)))},g.prototype.instantiateFromTree=function(e){var t={};u.each(e.commits,function(n){var r=this.getOrMakeRecursive(e,t,n.id);this.commitCollection.add(r)},this),u.each(e.branches,function(n){var r=this.getOrMakeRecursive(e,t,n.id);this.branchCollection.add(r,{silent:!0})},this);var n=this.getOrMakeRecursive(e,t,e.HEAD.id);this.HEAD=n,this.rootCommit=t.C0;if(!this.rootCommit)throw new Error("Need root commit of C0 for calculations");this.refs=t,this.gitVisuals.gitReady=!1,this.branchCollection.each(function(e){this.gitVisuals.addBranch(e)},this)},g.prototype.reloadGraphics=function(){this.gitVisuals.rootCommit=this.refs.C0,this.gitVisuals.initHeadBranch(),this.gitVisuals.drawTreeFromReload(),this.gitVisuals.refreshTreeHarsh()},g.prototype.getOrMakeRecursive=function(e,t,n){if(t[n])return t[n];var r=function(e,t){if(e.commits[t])return"commit";if(e.branches[t])return"branch";if(t=="HEAD")return"HEAD";throw new Error("bad type for "+t)},i=r(e,n);if(i=="HEAD"){var s=e.HEAD,o=new y(u.extend(e.HEAD,{target:this.getOrMakeRecursive(e,t,s.target)}));return t[n]=o,o}if(i=="branch"){var a=e.branches[n],f=new b(u.extend(e.branches[n],{target:this.getOrMakeRecursive(e,t,a.target)}));return t[n]=f,f}if(i=="commit"){var l=e.commits[n],c=[];u.each(l.parents,function(n){c.push(this.getOrMakeRecursive(e,t,n))},this);var h=new w(u.extend(l,{parents:c,gitVisuals:this.gitVisuals}));return t[n]=h,h}throw new Error("ruh rho!! unsupported type for "+n)},g.prototype.tearDown=function(){this.eventBaton.releaseBaton("processGitCommand",this.dispatch,this),this.removeAll()},g.prototype.removeAll=function(){this.branchCollection.reset(),this.commitCollection.reset(),this.refs={},this.HEAD=null,this.rootCommit=null,this.gitVisuals.resetAll()},g.prototype.getDetachedHead=function(){var e=this.HEAD.get("target"),t=e.get("type");return t!=="branch"},g.prototype.validateBranchName=function(e){e=e.replace(/\s/g,"");if(!/^[a-zA-Z0-9]+$/.test(e))throw new v({msg:l.str("bad-branch-name",{branch:e})});if(/[hH][eE][aA][dD]/.test(e))throw new v({msg:l.str("bad-branch-name",{branch:e})});return e.length>9&&(e=e.slice(0,9),this.command.addWarning(l.str("branch-name-short",{branch:e}))),e},g.prototype.makeBranch=function(e,t){e=this.validateBranchName(e);if(this.refs[e])throw new v({msg:l.str("bad-branch-name",{branch:name})});var n=new b({target:t,id:e});return this.branchCollection.add(n),this.refs[n.get("id")]=n,n},g.prototype.getHead=function(){return u.clone(this.HEAD)},g.prototype.getBranches=function(){var e=[];return this.branchCollection.each(function(t){e.push({id:t.get("id"),selected:this.HEAD.get("target")===t,target:t.get("target"),obj:t})},this),e},g.prototype.printBranchesWithout=function(e){var t=this.getUpstreamBranchSet(),n=this.getCommitFromRef(e).get("id"),r=[];u.each(t[n],function(e){e.selected=this.HEAD.get("target").get("id")==e.id,r.push(e)},this),this.printBranches(r)},g.prototype.printBranches=function(e){var t="";throw u.each(e,function(e){t+=(e.selected?"* ":"")+e.id+"\n"}),new m({msg:t})},g.prototype.makeCommit=function(e,t,n){if(!t){t=this.uniqueId("C");while(this.refs[t])t=this.uniqueId("C")}var r=new w(u.extend({parents:e,id:t,gitVisuals:this.gitVisuals},n||{}));return this.refs[r.get("id")]=r,this.commitCollection.add(r),r},g.prototype.acceptNoGeneralArgs=function(){if(this.generalArgs.length)throw new v({msg:l.str("git-error-no-general-args")})},g.prototype.validateArgBounds=function(e,t,n,r){var i=r===undefined?"git "+this.command.get("method"):this.command.get("method")+" "+r+" ";i="with "+i;if(e.length<t)throw new v({msg:l.str("git-error-args-few",{lower:String(t),what:i})});if(e.length>n)throw new v({msg:l.str("git-error-args-many",{upper:String(n),what:i})})},g.prototype.oneArgImpliedHead=function(e,t){this.validateArgBounds(e,0,1,t),e.length===0&&e.push("HEAD")},g.prototype.twoArgsImpliedHead=function(e,t){this.validateArgBounds(e,1,2,t),e.length==1&&e.push("HEAD")},g.prototype.revertStarter=function(){this.validateArgBounds(this.generalArgs,1,NaN);var e=this.revert(this.generalArgs);e&&this.animationFactory.rebaseAnimation(this.animationQueue,e,this,this.gitVisuals)},g.prototype.revert=function(e){var t=[];u.each(e,function(e){t.push(this.getCommitFromRef(e))},this);var n={};n.destinationBranch=this.resolveID(t[0]),n.toRebaseArray=t.slice(0),n.rebaseSteps=[];var r=this.gitVisuals.genSnapshot(),i,s=this.getCommitFromRef("HEAD");return u.each(t,function(e){var t=this.rebaseAltID(e.get("id")),o=l.str("git-revert-msg",{oldCommit:this.resolveName(e),oldMsg:e.get("commitMessage")}),u=this.makeCommit([s],t,{commitMessage:o});s=u,i=this.gitVisuals.genSnapshot(),n.rebaseSteps.push({oldCommit:e,newCommit:u,beforeSnapshot:r,afterSnapshot:i}),r=i},this),this.setTargetLocation("HEAD",s),n},g.prototype.resetStarter=function(){if(this.commandOptions["--soft"])throw new v({msg:l.str("git-error-staging")});this.commandOptions["--hard"]&&(this.command.addWarning(l.str("git-warning-hard")),this.generalArgs=this.generalArgs.concat(this.commandOptions["--hard"])),this.validateArgBounds(this.generalArgs,1,1);if(this.getDetachedHead())throw new v({msg:l.str("git-error-reset-detached")});this.reset(this.generalArgs[0])},g.prototype.reset=function(e){this.setTargetLocation("HEAD",this.getCommitFromRef(e))},g.prototype.cherrypickStarter=function(){this.validateArgBounds(this.generalArgs,1,Number.MAX_VALUE);var e=this.getUpstreamSet("HEAD");u.each(this.generalArgs,function(t){var n=this.getCommitFromRef(t);if(e[n.get("id")])throw new v({msg:l.str("git-error-already-exists",{commit:n.get("id")})})},this);var t={};t.destinationBranch=this.resolveID("HEAD"),t.toRebaseArray=[],t.rebaseSteps=[];var n=this.gitVisuals.genSnapshot(),r,i;u.each(this.generalArgs,function(e){var s=this.getCommitFromRef(e);t.toRebaseArray.push(s),i=this.cherrypick(e),r=this.gitVisuals.genSnapshot(),t.rebaseSteps.push({oldCommit:s,newCommit:i,beforeSnapshot:n,afterSnapshot:this.gitVisuals.genSnapshot()}),n=r},this),this.animationFactory.rebaseAnimation(this.animationQueue,t,this,this.gitVisuals)},g.prototype.cherrypick=function(e){var t=this.getCommitFromRef(e),n=this.rebaseAltID(t.get("id")),r=this.makeCommit([this.getCommitFromRef("HEAD")],n);return this.setTargetLocation(this.HEAD,r),r},g.prototype.commitStarter=function(){this.acceptNoGeneralArgs();if(this.commandOptions["-am"]&&(this.commandOptions["-a"]||this.commandOptions["-m"]))throw new v({msg:l.str("git-error-options")});var e=null,t=null;this.commandOptions["-a"]&&this.command.addWarning(l.str("git-warning-add")),this.commandOptions["-am"]&&(t=this.commandOptions["-am"],this.validateArgBounds(t,1,1,"-am"),e=t[0]),this.commandOptions["-m"]&&(t=this.commandOptions["-m"],this.validateArgBounds(t,1,1,"-m"),e=t[0]);var n=this.commit();e&&(e=e.replace(/&quot;/g,'"').replace(/^"/g,"").replace(/"$/g,""),n.set("commitMessage",e)),this.animationFactory.genCommitBirthAnimation(this.animationQueue,n,this.gitVisuals)},g.prototype.commit=function(){var e=this.getCommitFromRef(this.HEAD),t=null;this.commandOptions["--amend"]&&(e=this.resolveID("HEAD~1"),t=this.rebaseAltID(this.getCommitFromRef("HEAD").get("id")));var n=this.makeCommit([e],t);return this.getDetachedHead()&&this.command.addWarning(l.str("git-warning-detached")),this.setTargetLocation(this.HEAD,n),n},g.prototype.resolveName=function(e){var t=this.resolveID(e);return t.get("type")=="commit"?"commit "+t.get("id"):t.get("type")=="branch"?'branch "'+t.get("id")+'"':this.resolveName(t.get("target"))},g.prototype.resolveID=function(e){if(e===null||e===undefined)throw new Error("Dont call this with null / undefined");return typeof e!="string"?e:this.resolveStringRef(e)},g.prototype.resolveRelativeRef=function(e,t){var n=/([~\^])(\d*)/g,r;while(r=n.exec(t)){var i=e,s=r[2]?parseInt(r[2],10):1;if(r[1]=="^")i=e.getParent(s-1);else while(i&&s--)i=i.getParent(0);if(!i){var o=l.str("git-error-relative-ref",{commit:e.id,match:r[0]});throw new v({msg:o})}e=i}return e},g.prototype.resolveStringRef=function(e){if(this.refs[e])return this.refs[e];if(this.refs[e.toUpperCase()])return this.refs[e.toUpperCase()];var t=null,n=null,r=/^([a-zA-Z0-9]+)(([~\^]\d*)*)/,i=r.exec(e);if(!i)throw new v({msg:l.str("git-error-exist",{ref:e})});t=i[1],n=i[2];if(!this.refs[t])throw new v({msg:l.str("git-error-exist",{ref:e})});var s=this.getCommitFromRef(t);return n&&(s=this.resolveRelativeRef(s,n)),s},g.prototype.getCommitFromRef=function(e){var t=this.resolveID(e);while(t.get("type")!=="commit")t=t.get("target");return t},g.prototype.getType=function(e){return this.resolveID(e).get("type")},g.prototype.setTargetLocation=function(e,t){if(this.getType(e)=="commit")return;e=this.getOneBeforeCommit(e),e.set("target",t)},g.prototype.getUpstreamBranchSet=function(){var e={},t=function(e,t){var n=!1;return u.each(e,function(e){e.id==t&&(n=!0)}),n},n=function(e){var t=[],n=[e];while(n.length){var r=n.pop();t.push(r.get("id")),r.get("parents")&&r.get("parents").length&&(n=n.concat(r.get("parents")))}return t};return this.branchCollection.each(function(r){var i=n(r.get("target"));u.each(i,function(n){e[n]=e[n]||[],t(e[n],r.get("id"))||e[n].push({obj:r,id:r.get("id")})})}),e},g.prototype.getUpstreamHeadSet=function(){var e=this.getUpstreamSet("HEAD"),t=this.getCommitFromRef("HEAD").get("id");return e[t]=!0,e},g.prototype.getOneBeforeCommit=function(e){var t=this.resolveID(e);return t===this.HEAD&&!this.getDetachedHead()&&(t=t.get("target")),t},g.prototype.scrapeBaseID=function(e){var t=/^C(\d+)/.exec(e);if(!t)throw new Error("regex failed on "+e);return"C"+t[1]},g.prototype.rebaseAltID=function(e){var t=[[/^C(\d+)[']{0,2}$/,function(e){return e[0]+"'"}],[/^C(\d+)[']{3}$/,function(e){return e[0].slice(0,-3)+"'^4"}],[/^C(\d+)['][\^](\d+)$/,function(e){return"C"+String(e[1])+"'^"+String(Number(e[2])+1)}]];for(var n=0;n<t.length;n++){var r=t[n][0],i=t[n][1],s=r.exec(e);if(s){var o=i(s);return this.refs[o]?this.rebaseAltID(o):o}}throw new Error("could not modify the id "+e)},g.prototype.idSortFunc=function(e,t){var n=1e3,r=[[/^C(\d+)$/,function(e){return n*e[1]}],[/^C(\d+)([']+)$/,function(e){return n*e[1]+e[2].length}],[/^C(\d+)['][\^](\d+)$/,function(e){return n*e[1]+Number(e[2])}]],i=function(e){for(var t=0;t<r.length;t++){var n=r[t][0],i=r[t][1],s=n.exec(e);if(s)return i(s)}throw new Error("Could not parse commit ID "+e)};return i(e.get("id"))-i(t.get("id"))},g.prototype.dateSortFunc=function(e,t){var n=new Date(e.get("createTime")),r=new Date(t.get("createTime"));return n-r===0?g.prototype.idSortFunc(e,t):n-r},g.prototype.rebaseInteractiveStarter=function(){var e=this.commandOptions["-i"];this.twoArgsImpliedHead(e," -i"),this.rebaseInteractive(e[0],e[1])},g.prototype.rebaseStarter=function(){if(this.commandOptions["-i"]){this.rebaseInteractiveStarter();return}this.twoArgsImpliedHead(this.generalArgs);var e=this.rebase(this.generalArgs[0],this.generalArgs[1]);if(e===undefined)return;this.animationFactory.rebaseAnimation(this.animationQueue,e,this,this.gitVisuals)},g.prototype.rebase=function(e,t){if(this.isUpstreamOf(e,t)){this.command.setResult(l.str("git-result-uptodate")),this.checkout(t);return}if(this.isUpstreamOf(t,e)){this.setTargetLocation(t,this.getCommitFromRef(e)),this.command.setResult(l.str("git-result-fastforward")),this.checkout(t);return}var n=this.getUpstreamSet(e),r=[],i=[this.getCommitFromRef(t)];while(i.length){var s=i.pop();if(n[s.get("id")])continue;r.push(s),r.sort(this.dateSortFunc),i=i.concat(s.get("parents"))}return this.rebaseFinish(r,n,e,t)},g.prototype.rebaseInteractive=function(t,n){if(this.isUpstreamOf(n,t))throw new v({msg:l.str("git-result-nothing")});var r=this.getUpstreamSet(t),i=[],s=[this.getCommitFromRef(n)];while(s.length){var o=s.pop();if(r[o.get("id")])continue;i.push(o),s=s.concat(o.get("parents")),s.sort(this.dateSortFunc)}var a=[];u.each(i,function(e){e.get("parents").length==1&&a.push(e)});if(!a.length)throw new v({msg:l.str("git-error-rebase-none")});this.animationQueue.set("defer",!0);var c=f.defer();c.promise.then(u.bind(function(e){if(!e.length)throw new m({msg:l.str("git-result-nothing")});var r=this.rebaseFinish(e,{},t,n);this.animationFactory.rebaseAnimation(this.animationQueue,r,this,this.gitVisuals),this.animationQueue.start()},this)).fail(u.bind(function(e){this.filterError(e),this.command.set("error",e),this.animationQueue.start()},this)).done();var h=e("../views/rebaseView").InteractiveRebaseView;new h({deferred:c,toRebase:a})},g.prototype.rebaseFinish=function(e,t,n,r){var i={};i.destinationBranch=this.resolveID(n);var s=[];u.each(e,function(e){e.get("parents").length==1&&s.push(e)});var o={};u.each(t,function(e,t){o[this.scrapeBaseID(t)]=e},this),e=s,s=[],u.each(e,function(e){var t=this.scrapeBaseID(e.get("id"));o[t]||s.push(e)},this),e=s,s=[];var a={};u.each(e,function(e){if(a[e.get("id")])return;a[e.get("id")]=!0,s.push(e)},this);if(!s.length)throw new v({msg:l.str("git-error-rebase-none")});i.toRebaseArray=s.slice(0);var f=this.getCommitFromRef(n);i.rebaseSteps=[];var c=this.gitVisuals.genSnapshot(),h;u.each(s,function(e){var t=this.rebaseAltID(e.get("id")),n=this.makeCommit([f],t);f=n,h=this.gitVisuals.genSnapshot(),i.rebaseSteps.push({oldCommit:e,newCommit:n,beforeSnapshot:c,afterSnapshot:h}),c=h},this);if(this.resolveID(r).get("type")=="commit"){var p=i.rebaseSteps,d=p[p.length-1].newCommit;this.checkout(d)}else this.setTargetLocation(r,f),this.checkout(r);return i},g.prototype.mergeStarter=function(){this.validateArgBounds(this.generalArgs,1,1);var e=this.merge(this.generalArgs[0]);if(e===undefined){this.animationFactory.refreshTree(this.animationQueue,this.gitVisuals);return}this.animationFactory.genCommitBirthAnimation(this.animationQueue,e,this.gitVisuals)},g.prototype.merge=function(e){var t="HEAD";if(this.isUpstreamOf(e,t)||this.getCommitFromRef(e)===this.getCommitFromRef(t))throw new m({msg:l.str("git-result-uptodate")});if(this.isUpstreamOf(t,e)){this.setTargetLocation(t,this.getCommitFromRef(e)),this.command.setResult(l.str("git-result-fastforward"));return}var n=this.getCommitFromRef(t),r=this.getCommitFromRef(e),i=l.str("git-merge-msg",{target:this.resolveName(e),current:this.resolveName(t)}),s=this.makeCommit([n,r],null,{commitMessage:i});return this.setTargetLocation(t,s),s},g.prototype.checkoutStarter=function(){var e=null;if(this.commandOptions["-b"]){if(this.generalArgs.length)throw new v({msg:l.str("git-error-options")});e=this.commandOptions["-b"],this.twoArgsImpliedHead(e,"-b");var t=this.validateBranchName(e[0]);this.branch(t,e[1]),this.checkout(t);return}if(this.commandOptions["-"]){var n=this.HEAD.get("lastLastTarget");if(!n)throw new v({msg:l.str("git-result-nothing")});this.HEAD.set("target",n);return}if(this.commandOptions["-B"]){e=this.commandOptions["-B"],this.twoArgsImpliedHead(e,"-B"),this.forceBranch(e[0],e[1]),this.checkout(e[0]);return}this.validateArgBounds(this.generalArgs,1,1),this.checkout(this.unescapeQuotes(this.generalArgs[0]))},g.prototype.checkout=function(e){var t=this.resolveID(e);if(t.get("id")==="HEAD")return;var n=t.get("type");if(n!=="branch"&&n!=="commit")throw new v({msg:l.str("git-error-options")});this.HEAD.set("target",t)},g.prototype.branchStarter=function(){var e=null;if(this.commandOptions["-d"]||this.commandOptions["-D"]){var t=this.commandOptions["-d"]||this.commandOptions["-D"];this.validateArgBounds(t,1,NaN,"-d"),u.each(t,function(e){this.deleteBranch(e)},this);return}if(this.commandOptions["--contains"]){e=this.commandOptions["--contains"],this.validateArgBounds(e,1,1,"--contains"),this.printBranchesWithout(e[0]);return}if(this.commandOptions["-f"]){e=this.commandOptions["-f"],this.twoArgsImpliedHead(e,"-f"),this.forceBranch(e[0],e[1]);return}if(this.generalArgs.length===0){this.printBranches(this.getBranches());return}this.twoArgsImpliedHead(this.generalArgs),this.branch(this.generalArgs[0],this.generalArgs[1])},g.prototype.forceBranch=function(e,t){this.refs[e]||this.branch(e,t);var n=this.resolveID(e);if(n.get("type")!=="branch")throw new v({msg:l.str("git-error-options")});var r=this.getCommitFromRef(t);this.setTargetLocation(n,r)},g.prototype.branch=function(e,t){var n=this.getCommitFromRef(t);this.makeBranch(e,n)},g.prototype.deleteBranch=function(e){var t=this.resolveID(e);if(t.get("type")!=="branch"||t.get("id")=="master"||this.HEAD.get("target")===t)throw new v({msg:l.str("git-error-branch")});var n=t;this.branchCollection.remove(n),this.refs[n.get("id")]=undefined,delete this.refs[n.get("id")],n.get("visBranch")&&n.get("visBranch").remove()},g.prototype.unescapeQuotes=function(e){return e.replace(/&#x27;/g,"'")},g.prototype.filterError=function(e){if(!(e instanceof v||e instanceof m))throw e},g.prototype.dispatch=function(e,t){this.command=e,this.commandOptions=e.get("supportedMap"),this.generalArgs=e.get("generalArgs");var n=u.bind(function(){e.finishWith(t)},this);this.animationQueue=new h({callback:n});try{var r=e.get("method").replace(/-/g,"")+"Starter";this[r]()}catch(i){this.filterError(i),e.set("error",i),t.resolve();return}!this.animationQueue.get("animations").length&&!this.animationQueue.get("defer")&&this.animationFactory.refreshTree(this.animationQueue,this.gitVisuals),this.animationQueue.get("defer")||this.animationQueue.start()},g.prototype.showStarter=function(){this.oneArgImpliedHead(this.generalArgs),this.show(this.generalArgs[0])},g.prototype.show=function(e){var t=this.getCommitFromRef(e);throw new m({msg:t.getShowEntry()})},g.prototype.statusStarter=function(){var e=[];if(this.getDetachedHead())e.push(l.str("git-status-detached"));else{var t=this.HEAD.get("target").get("id");e.push(l.str("git-status-onbranch",{branch:t}))}e.push("Changes to be committed:"),e.push(""),e.push("&nbsp;&nbsp;&nbsp; modified: cal/OskiCostume.stl"),e.push(""),e.push(l.str("git-status-readytocommit"));var n="";throw u.each(e,function(e){n+="# "+e+"\n"}),new m({msg:n})},g.prototype.logStarter=function(){if(this.generalArgs.length==2){if(this.generalArgs[1][0]!="^")throw new v({msg:l.str("git-error-options")});this.logWithout(this.generalArgs[0],this.generalArgs[1])}this.oneArgImpliedHead(this.generalArgs),this.log(this.generalArgs[0])},g.prototype.logWithout=function(e,t){t=t.slice(1),this.log(e,this.getUpstreamSet(t))},g.prototype.log=function(e,t){t=t||{};var n=this.getCommitFromRef(e),r=[],i=[n],s={};while(i.length){var o=i.shift(0);if(s[o.get("id")]||t[o.get("id")])continue;s[o.get("id")]=!0,r.push(o),o.get("parents")&&o.get("parents").length&&(i=i.concat(o.get("parents")))}var a="";throw u.each(r,function(e){a+=e.getLogEntry()},this),new m({msg:a})},g.prototype.addStarter=function(){throw new m({msg:l.str("git-error-staging")})},g.prototype.getCommonAncestor=function(e,t){if(this.isUpstreamOf(t,e))throw new Error("Dont use common ancestor if we are upstream!");var n=this.getUpstreamSet(e),r=[this.getCommitFromRef(t)];while(r.length){var i=r.pop();if(n[i.get("id")])return i;r=r.concat(i.get("parents"))}throw new Error("something has gone very wrong... two nodes arent connected!")},g.prototype.isUpstreamOf=function(e,t){e=this.getCommitFromRef(e);var n=this.getUpstreamSet(t);return n[e.get("id")]!==undefined},g.prototype.getUpstreamSet=function(e){var t=this.getCommitFromRef(e),n=t.get("id"),r=[t],i={};i[n]=!0;var s=function(e){i[e.get("id")]=!0,r.push(e)};while(r.length){var o=r.pop(),a=o.get("parents");u.each(a,s)}return i};var y=a.Model.extend({initialize:function(){if(!this.get("target"))throw new Error("must be initialized with target");if(!this.get("id"))throw new Error("must be given an id");this.set("type","general ref"),this.get("id")=="HEAD"&&(this.set("lastLastTarget",null),this.set("lastTarget",this.get("target")),this.on("change:target",this.targetChanged,this))},targetChanged:function(e,t,n){this.set("lastLastTarget",this.get("lastTarget")),this.set("lastTarget",t)},toString:function(){return"a "+this.get("type")+"pointing to "+String(this.get("target"))}}),b=y.extend({defaults:{visBranch:null},initialize:function(){y.prototype.initialize.call(this),this.set("type","branch")}}),w=a.Model.extend({defaults:{type:"commit",children:null,parents:null,author:"Peter Cottle",createTime:null,commitMessage:null,visNode:null,gitVisuals:null},constants:{circularFields:["gitVisuals","visNode","children"]},getLogEntry:function(){return["Author: "+this.get("author"),"Date: "+this.get("createTime"),"<br/>",this.get("commitMessage"),"<br/>","Commit: "+this.get("id")].join("\n")+"\n"},getShowEntry:function(){return[this.getLogEntry(),"diff --git a/bigGameResults.html b/bigGameResults.html","--- bigGameResults.html","+++ bigGameResults.html","@@ 13,27 @@ Winner, Score","- Stanfurd, 14-7","+ Cal, 21-14"].join("\n")+"\n"},validateAtInit:function(){if(!this.get("id"))throw new Error("Need ID!!");this.get("createTime")||this.set("createTime",(new Date).toString()),this.get("commitMessage")||this.set("commitMessage",l.str("git-dummy-msg")),this.set("children",[]);if(!this.get("rootCommit"))if(!this.get("parents")||!this.get("parents").length)throw new Error("needs parents")},addNodeToVisuals:function(){var e=this.get("gitVisuals").addNode(this.get("id"),this);this.set("visNode",e)},addEdgeToVisuals:function(e){this.get("gitVisuals").addEdge(this.get("id"),e.get("id"))},getParent:function(e){return this&&this.attributes&&this.attributes.parents?this.attributes.parents[e]:null},isMainParent:function(e){var t=this.get("parents").indexOf(e);return t===0},initialize:function(e){this.validateAtInit(),this.addNodeToVisuals(),u.each(this.get("parents"),function(e){e.get("children").push(this),this.addEdgeToVisuals(e)},this)}});n.GitEngine=g,n.Commit=w,n.Branch=b,n.Ref=y}),e("/src/js/git/index.js"),e.define("/src/js/git/treeCompare.js",function(e,t,n,r,i,s,o){function a(){}var u=e("underscore");a.prototype.compareAllBranchesWithinTreesAndHEAD=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),e.HEAD.target==t.HEAD.target&&this.compareAllBranchesWithinTrees(e,t)},a.prototype.compareAllBranchesWithinTrees=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t);var n=u.extend({},e.branches,t.branches),r=!0;return u.uniq(n,function(n,i){r=r&&this.compareBranchWithinTrees(e,t,i)},this),r},a.prototype.compareBranchesWithinTrees=function(e,t,n){var r=!0;return u.each(n,function(n){r=r&&this.compareBranchWithinTrees(e,t,n)},this),r},a.prototype.compareBranchWithinTrees=function(e,t,n){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var r=this.getRecurseCompare(e,t),i=e.branches[n],s=t.branches[n];return u.isEqual(i,s)&&r(e.commits[i.target],t.commits[s.target])},a.prototype.compareAllBranchesWithinTreesHashAgnostic=function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var n=u.extend({},e.branches,t.branches),r=[];return u.each(n,function(e,t){r.push(t)}),this.compareBranchesWithinTreesHashAgnostic(e,t,r)},a.prototype.compareBranchesWithinTreesHashAgnostic=function(e,t,n){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var r=u.bind(function(e,t){return!e||!t?!1:(e=u.clone(e),t=u.clone(t),e.target=this.getBaseRef(e.target),t.target=this.getBaseRef(t.target),u.isEqual(e,t))},this),i=this.getRecurseCompareHashAgnostic(e,t),s=!0;return u.each(n,function(n){var o=e.branches[n],u=t.branches[n];s=s&&r(o,u)&&i(e.commits[o.target],t.commits[u.target])},this),s},a.prototype.evalAsserts=function(e,t){var n=!0;return u.each(t,function(t,r){n=n&&this.evalAssertsOnBranch(e,r,t)},this),console.log("EVAL ASSETS was",n),n},a.prototype.evalAssertsOnBranch=function(e,t,n){e=this.convertTreeSafe(e),console.log("doing asserts on",t);if(!e.branches[t])return!1;var r=e.branches[t],i=[r.target],s={};while(i.length){var o=i.pop();console.log(o),s[this.getBaseRef(o)]=this.getNumHashes(o),i=i.concat(e.commits[o].parents)}console.log("data is",s);var a=!0;return u.each(n,function(e){try{a=a&&e(s)}catch(t){console.err(t),a=!1}}),a},a.prototype.getNumHashes=function(e){var t=[[/^C(\d+)([']{0,3})$/,function(e){return e[2]?e[2].length:0}],[/^C(\d+)['][\^](\d+)$/,function(e){return Number(e[2])}]];for(var n=0;n<t.length;n++){var r=t[n][0],i=t[n][1],s=r.exec(e);if(s)return i(s)}throw new Error("coudlnt parse ref "+e)},a.prototype.getBaseRef=function(e){var t=/^C(\d+)/,n=t.exec(e);if(!n)throw new Error("no regex matchy for "+e);return"C"+n[1]},a.prototype.getRecurseCompareHashAgnostic=function(e,t){var n=u.bind(function(e){return e?u.extend({},e,{id:this.getBaseRef(e.id),parents:null}):{}},this),r=function(e,t){return u.isEqual(n(e),n(t))};return this.getRecurseCompare(e,t,{isEqual:r})},a.prototype.getRecurseCompare=function(e,t,n){n=n||{};var r=function(i,s){var o=n.isEqual?n.isEqual(i,s):u.isEqual(i,s);if(!o)return!1;var a=Math.max(i.parents.length,s.parents.length);return u.each(u.range(a),function(n){var u=i.parents[n],a=s.parents[n],f=e.commits[u],l=t.commits[a];o=o&&r(f,l)},this),o};return r},a.prototype.convertTreeSafe=function(e){return typeof e=="string"?JSON.parse(unescape(e)):e},a.prototype.reduceTreeFields=function(e){var t=["parents","id","rootCommit"],n=["children","parents"],r=["target","id"],i=function(e,t,n,r){var i=e[t];u.each(i,function(i,s){var o={};u.each(n,function(e){i[e]!==undefined&&(o[e]=i[e])}),u.each(r,function(e){i[e]&&(i[e].sort(),o[e]=i[e])}),e[t][s]=o})};u.each(e,function(e){i(e,"commits",t,n),i(e,"branches",r),e.HEAD={target:e.HEAD.target,id:e.HEAD.id}})},a.prototype.compareTrees=function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]),u.isEqual(e,t)},n.TreeCompare=a}),e("/src/js/git/treeCompare.js"),e.define("/src/js/intl/checkStrings.js",function(e,t,n,r,i,s,o){var u=e("sys"),a=e("underscore"),f=e("child_process"),l=e("../intl/strings").strings,c='grep -C 2 -r "intl.str(" ../../',h=function(e){return'grep -r "'+e+'" ../../'},p=/intl.str\('([a-zA-Z\-]+)'/g,d=/\s+'([a-z\-]+)',/g,v=function(e){f.exec(h(e),function(e,t){console.log(t)})},m=function(e){l[e]||(console.log('NO KEY for: "',e,'"'),v(e))},g=function(e){a.each(e,function(e){var t=p.exec(e);if(t&&t[1]){m(t[1]);return}t=d.exec(e),t&&t[1]&&m(t[1])})};f.exec(c,function(e,t){g(t.split("\n"))})}),e("/src/js/intl/checkStrings.js"),e.define("/src/js/intl/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util/constants"),f=e("../util"),l=e("../intl/strings").strings,c=n.getDefaultLocale=function(){return"en_US"},h=n.getLocale=function(){return a.GLOBAL.locale?a.GLOBAL.locale:c()},p=u.clone(u.templateSettings);p.interpolate=/\{(.+?)\}/g;var d=n.template=function(e,t){return u.template(e,t,p)},v=n.str=function(e,t){t=t||{};var n=h();return l[e]?l[e][n]?d(l[e][n],t):e!=="error-untranslated"?v("error-untranslated"):'No translation for the key "'+e+'"':(console.warn("NO INTL support for key "+e),"NO INTL support for key "+e)},m=n.getIntlKey=function(e,t){if(!e||!e[t])throw new Error("that key "+t+"doesnt exist in this blob"+e);return e[t][c()]||console.warn("WARNING!! This blob does not have intl support:",e,"for this key",t),e[t][h()]},g=n.getDialog=function(e){var t=c();return m(e,"dialog")||e.dialog[t]},y=n.getHint=function(e){return m(e,"hint")||v("error-untranslated")},b=n.getName=function(e){return m(e,"name")||v("error-untranslated")},w=n.getStartDialog=function(e){var t=m(e,"startDialog");if(t)return t;var n={type:"ModalAlert",options:{markdown:v("error-untranslated")}},r=u.clone(e.startDialog[f.getDefaultLocale()]||e.startDialog);return r.childViews.unshift(n),r}}),e("/src/js/intl/index.js"),e.define("/src/js/intl/strings.js",function(e,t,n,r,i,s,o){n.strings={"finish-dialog-finished":{__desc__:"One of the lines in the next level dialog",en_US:"Wow! You finished the last level, great!",zh_CN:""},"finish-dialog-next":{__desc__:"One of the lines in the next level dialog",en_US:'Would you like to move on to *"{nextLevel}"*, the next level?',zh_CN:" *{nextLevel}*"},"finish-dialog-win":{__desc__:"One of the lines in the next level dialog",en_US:"Awesome! You matched or exceeded our solution.",zh_CN:""},"finish-dialog-lose":{__desc__:"When the user entered more commands than our best, encourage them to do better",en_US:"See if you can whittle it down to {best} :D",zh_CN:" {best} :D"},"git-status-detached":{__desc__:"One of the lines for git status output",en_US:"Detached head!",zh_CN:"Detached head"},"git-status-onbranch":{__desc__:"One of the lines for git status output",en_US:"On branch {branch}",zh_CN:" {branch}"},"git-status-readytocommit":{__desc__:"One of the lines for git status output",en_US:"Ready to commit! (as always in this demo)",zh_CN:""},"git-dummy-msg":{__desc__:"The dummy commit message for all commits. Feel free to put in a shoutout to your school / city / whatever!",en_US:"Quick commit. Go Bears!",zh_CN:""},"git-error-branch":{__desc__:"One of the error messages for git",en_US:"You can't delete the master branch, the branch you are on, or things that aren't branches",zh_CN:"master西"},"git-merge-msg":{__desc__:"The commit message for a merge commit",en_US:"Merge {target} into {current}",zh_CN:" {target} {current}"},"git-error-rebase-none":{__desc__:"One of the error messages for git",en_US:"No commits to rebase! Everything is a merge commit or changes already applied",zh_CN:" rebase rebase "},"git-result-nothing":{__desc__:"The message that explains the result of a git command",en_US:"Nothing to do...",zh_CN:""},"git-result-fastforward":{__desc__:"The message that explains the result of a git command",en_US:"Fast forwarding...",zh_CN:""},"git-result-uptodate":{__desc__:"The message that explains the result of a git command",en_US:"Branch already up-to-date",zh_CN:""},"git-error-exist":{__desc__:"One of the error messages for git",en_US:"The ref {ref} does not exist or is unknown",zh_CN:" {ref} "},"git-error-relative-ref":{__desc__:"One of the error messages for git",en_US:"Commit {commit} doesnot have a {match}",zh_CN:" {commit} {match}"},"git-warning-detached":{__desc__:"One of the warning messages for git",en_US:"Warning!! Detached HEAD state",zh_CN:"Detached HEAD"},"git-warning-add":{__desc__:"One of the warning messages for git",en_US:"No need to add files in this demo",zh_CN:""},"git-error-options":{__desc__:"One of the error messages for git",en_US:"Those options you specified are incompatible or incorrect",zh_CN:""},"git-error-already-exists":{__desc__:"One of the error messages for git",en_US:"The commit {commit} already exists in your changes set, aborting!",zh_CN:" {commit} "},"git-error-reset-detached":{__desc__:"One of the error messages for git",en_US:"Can't reset in detached head! Use checkout if you want to move",zh_CN:" HEAD checkout "},"git-warning-hard":{__desc__:"One of the warning messages for git",en_US:"The default behavior is a --hard reset, feel free to omit that option!",zh_CN:" --hard "},"git-error-staging":{__desc__:"One of the error messages for git",en_US:"There is no concept of adding / staging files, so that option or command is invalid!",zh_CN:""},"git-revert-msg":{__desc__:"Message for reverting git command",en_US:"Reverting {oldCommit}: {oldMsg}",zh_CN:" {oldCommit}{oldMsg}"},"git-error-args-many":{__desc__:"One of the error messages for git",en_US:"I expect at most {upper} argument(s) for {what}",zh_CN:"{what} {upper} "},"git-error-args-few":{__desc__:"One of the error messages for git",en_US:"I expect at least {lower} argument(s) for {what}",zh_CN:"{what} {lower} "},"git-error-no-general-args":{__desc__:"One of the error messages for git",en_US:"That command accepts no general arguments",zh_CN:""},"copy-tree-string":{__desc__:"The prompt to copy the tree when sharing",en_US:"Copy the tree string below",zh_CN:""},"learn-git-branching":{__desc__:"The title of the app, with spaces",en_US:"Learn Git Branching",ko:"Git ",zh_CN:"Git"},"select-a-level":{__desc__:"The prompt to select a level on the drop down view",en_US:"Select a level",zh_CN:""},"branch-name-short":{__desc__:"When branch names get too long, we need to truncate them. This is the warning for that",en_US:'Sorry, we need to keep branch names short for the visuals. Your branch name was truncated to 9 characters, resulting in "{branch}"',zh_CN:'使9"{branch}"'},"bad-branch-name":{__desc__:"When the user enters a branch name thats not ok",en_US:'That branch name "{branch}" is not allowed!',zh_CN:' "{branch}"'},"option-not-supported":{__desc__:"When the user specifies an option that is not supported by our demo",en_US:'The option "{option}" is not supported!',zh_CN:' "{option}"'},"git-usage-command":{__desc__:"The line that shows how to format a git command",en_US:"git <command> [<args>]",zh_CN:"git <> [<>]"},"git-supported-commands":{__desc__:"In the git help command, the header above the supported commands",en_US:"Supported commands:",zh_CN:":"},"git-usage":{__desc__:"In the dummy git output, the header before showing all the commands",en_US:"Usage:",zh_CN:"使:"},"git-version":{__desc__:"The git version dummy output, kind of silly. PCOTTLE is my unix name but feel free to put yours instead",en_US:"Git Version PCOTTLE.1.0",zh_CN:"Git PCOTTLE.1.0"},"refresh-tree-command":{__desc__:"when the tree is visually refreshed",en_US:"Refreshing tree...",zh_CN:"..."},"locale-command":{__desc__:"when the locale is set to something",en_US:"Locale set to {locale}",zh_CN:" {locale}"},"locale-reset-command":{__desc__:"when the locale is reset",en_US:"Locale reset to default, which is {locale}",zh_CN:" {locale}"},"show-command":{__desc__:'command output title from "show"',en_US:"Please use one of the following commands for more info:"},"show-all-commands":{__desc__:'command output title from "show commands"',en_US:"Here is a list of all the commmands available:"},"cd-command":{__desc__:"dummy command output for the command in the key",en_US:'Directory changed to "/directories/dont/matter/in/this/demo"',zh_CN:' "/directories/dont/matter/in/this/demo"'},"ls-command":{__desc__:"Dummy command output for the command in the key",en_US:"DontWorryAboutFilesInThisDemo.txt",zh_CN:"DontWorryAboutFilesInThisDemo.txt (: .txt)"},"mobile-alert":{__desc__:"When someone comes to the site on a mobile device, they can not input commands so this is a nasty alert to tell them",en_US:"Can't bring up the keyboard on mobile / tablet :( try visiting on desktop! :D",zh_CN:"/ :( :D"},"share-tree":{__desc__:"When you export a tree, we want you to share the tree with friends",en_US:'Share this tree with friends! They can load it with "import tree"',zh_CN:' "import tree" '},"paste-json":{__desc__:"When you are importing a level or tree",en_US:"Paste a JSON blob below!",zh_CN:"JSON"},"solved-map-reset":{__desc__:"When you reset the solved map to clear your solved history, in case someone else wants to use your browser",fr_FR:"La carte des solutions a été effacée, vous repartez de zéro !",en_US:"Solved map was reset, you are starting from a clean slate!",zh_CN:""},"level-cant-exit":{__desc__:"When the user tries to exit a level when they are not in one",en_US:'You are not in a level! You are in a sandbox, start a level with "levels"',zh_CN:' "levels"'},"level-no-id":{__desc__:"When you say an id but that level doesnt exist",en_US:'A level for that id "{id}" was not found! Opening up a level selection view',zh_CN:'id "{id}" '},"undo-stack-empty":{__desc__:"The undo command can only undo back until the last time the level was reset or the beginning of the level",en_US:"The undo stack is empty!",zh_CN:""},"already-solved":{__desc__:"When you play in a level that is already solved",en_US:'You have already solved this level, try other levels with "levels" or go back to sandbox with "sandbox"',zh_CN:' "levels" "sandbox" '},"command-disabled":{__desc__:"When you try a command that is disabled",en_US:"That git command is disabled for this level!",zh_CN:"使"},"share-json":{__desc__:"when you have made the level, prompt to share this",en_US:"Here is the JSON for this level! Share it with somenoe or send it to me on Github",zh_CN:"JSONGitHub"},"want-start-dialog":{__desc__:"prompt to add a start dialog",en_US:"You have not specified a start dialog, would you like to add one?",zh_CN:""},"want-hint":{__desc__:"prompt to add a hint",en_US:"You have not specified a hint, would you like to add one?",zh_CN:""},"prompt-hint":{__desc__:"prompt for hint",en_US:"Enter the hint for this level, or leave this blank if you do not want to include one",zh_CN:""},"prompt-name":{__desc__:"prompt for level name",en_US:"Enter the name for the level",zh_CN:""},"solution-empty":{__desc__:"If you define a solution without any commands, aka a level that is solved without doing anything",en_US:"Your solution is empty!! Something is amiss",zh_CN:"!! "},"define-start-warning":{__desc__:"When you define the start point again, it overwrites the solution and goal so we add a warning",en_US:"Defining start point... solution and goal will be overwritten if they were defined earlier",zh_CN:"... "},"help-vague-level":{__desc__:"When you are in a level and you say help, its vague and you need to specify",en_US:'You are in a level, so multiple forms of help are available. Please select either "help level" or "help general"',zh_CN:' "help level" () "help general" ()'},"help-vague-builder":{__desc__:"When you are in a level builder, the help command is vague so you need to specify what you mean",en_US:'You are in a level builder, so multiple forms of help are available. Please select either "help general" or "help builder"',zh_CN:' "help general" () "help builder" ()'},"goal-to-reach":{__desc__:"title of window that shoes the goal tree to reach",en_US:"Goal To Reach",zh_CN:""},"hide-goal":{__desc__:"the helper message for the window that shows the goal tree",en_US:'You can hide this window with "hide goal"',zh_CN:' "hide goal" '},"hide-start":{__desc__:"The helper message for the window that shows the start tree for a level",en_US:'You can hide this window with "hide start"',zh_CN:' "hide start" '},"level-builder":{__desc__:"The name for the environment where you build levels",en_US:"Level Builder",zh_CN:""},"no-start-dialog":{__desc__:"when the user tries to open a start dialog for a level that does not have one",en_US:"There is no start dialog to show for this level!",zh_CN:"? !"},"no-hint":{__desc__:"when no hint is available for a level",en_US:"Hmm, there doesn't seem to be a hint for this level :-/",zh_CN:"~ :-/"},"error-untranslated-key":{__desc__:"This error happens when we are trying to translate a specific key and the locale version is mission",en_US:"The translation for {key} does not exist yet :( Please hop on github and offer up a translation!",zh_CN:" {key} :( gitHub!"},"error-untranslated":{__desc__:"The general error when we encounter a dialog that is not translated",fr_FR:"Ce message n'a pas encore été traduit dans votre langue :( Venez sur Github aider à la traduction !",en_US:"This dialog or text is not yet translated in your locale :( Hop on github to aid in translation!",zh_CN:" :( gitHub!"}}}),e("/src/js/intl/strings.js"),e.define("/src/js/level/arbiter.js",function(e,t,n,r,i,s,o){function h(){this.levelMap={},this.levelSequences=f,this.sequences=[],this.init();var e;try{e=JSON.parse(localStorage.getItem("solvedMap")||"{}")}catch(t){console.warn("local storage failed",t)}this.solvedMap=e||{},c.getEvents().on("levelSolved",this.levelSolved,this)}var u=e("underscore"),a=e("backbone"),f=e("../../levels").levelSequences,l=e("../../levels").sequenceInfo,c=e("../app");h.prototype.init=function(){var e;u.each(this.levelSequences,function(e,t){this.sequences.push(t);if(!e||!e.length)throw new Error("no empty sequences allowed");u.each(e,function(e,n){this.validateLevel(e);var r=t+String(n+1),i=u.extend({},e,{index:n,id:r,sequenceName:t});this.levelMap[r]=i,this.levelSequences[t][n]=i},this)},this)},h.prototype.isLevelSolved=function(e){if(!this.levelMap[e])throw new Error("that level doesnt exist!");return Boolean(this.solvedMap[e])},h.prototype.levelSolved=function(e){if(!e)return;this.solvedMap[e]=!0,this.syncToStorage()},h.prototype.resetSolvedMap=function(){this.solvedMap={},this.syncToStorage(),c.getEvents().trigger("levelSolved")},h.prototype.syncToStorage=function(){try{localStorage.setItem("solvedMap",JSON.stringify(this.solvedMap))}catch(e){console.warn("local storage fialed on set",e)}},h.prototype.validateLevel=function(e){e=e||{};var t=["name","goalTreeString","solutionCommand"],n=["hint","disabledMap","startTree"];u.each(t,function(t){if(e[t]===undefined)throw console.log(e),new Error("I need this field for a level: "+t)})},h.prototype.getSequenceToLevels=function(){return this.levelSequences},h.prototype.getSequences=function(){return u.keys(this.levelSequences)},h.prototype.getLevelsInSequence=function(e){if(!this.levelSequences[e])throw new Error("that sequecne name "+e+"does not exist");return this.levelSequences[e]},h.prototype.getSequenceInfo=function(e){return l[e]},h.prototype.getLevel=function(e){return this.levelMap[e]},h.prototype.getNextLevel=function(e){if(!this.levelMap[e])return console.warn("that level doesnt exist!!!"),null;var t=this.levelMap[e],n=t.sequenceName,r=this.levelSequences[n],i=t.index+1;if(i<r.length)return r[i];var s=this.sequences.indexOf(n)+1;if(s<this.sequences.length){var o=this.sequences[s];return this.levelSequences[o][0]}return null},n.LevelArbiter=h}),e("/src/js/level/arbiter.js"),e.define("/src/js/level/builder.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("q"),l=e("../util"),c=e("../app"),h=e("../intl"),p=e("../util/errors"),d=e("../visuals/visualization").Visualization,v=e("../level/parseWaterfall").ParseWaterfall,m=e("../level").Level,g=e("../models/commandModel").Command,y=e("../git/gitShim").GitShim,b=e("../views/multiView").MultiView,w=e("../views").CanvasTerminalHolder,E=e("../views").ConfirmCancelTerminal,S=e("../views").NextLevelConfirm,x=e("../views").LevelToolbar,T=e("../views/builderViews").MarkdownPresenter,N=e("../views/builderViews").MultiViewBuilder,C=e("../views/builderViews").MarkdownGrabber,k={"define goal":/^define goal$/,"define name":/^define name$/,"help builder":/^help builder$/,"define start":/^define start$/,"edit dialog":/^edit dialog$/,"show start":/^show start$/,"hide start":/^hide start$/,"define hint":/^define hint$/,finish:/^finish$/},L=l.genParseCommand(k,"processLevelBuilderCommand"),A=m.extend({initialize:function(t){t=t||{},t.level=t.level||{};var n=h.getLocale();t.level.startDialog={},t.level.startDialog[n]={childViews:h.getDialog(e("../dialogs/levelBuilder"))},A.__super__.initialize.apply(this,[t]),this.startDialogObj=undefined,this.definedGoal=!1,delete this.treeCompare,delete this.solved},initName:function(){this.levelToolbar=new x({name:h.str("level-builder")})},initGoalData:function(){this.level.goalTreeString='{"branches":{"master":{"target":"C1","id":"master"},"makeLevel":{"target":"C2","id":"makeLevel"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"makeLevel","id":"HEAD"}}',this.level.solutionCommand="git checkout -b makeLevel; git commit",A.__super__.initGoalData.apply(this,arguments)},initStartVisualization:function(){return this.startCanvasHolder=new w({additionalClass:"startTree",text:h.str("hide-start")}),this.startVis=new d({el:this.startCanvasHolder.getCanvasLocation(),containerElement:this.startCanvasHolder.getCanvasLocation(),treeString:this.level.startTree,noKeyboardInput:!0,noClick:!0}),this.startCanvasHolder},startOffCommand:function(){c.getEventBaton().trigger("commandSubmitted","echo :D")},objectiveDialog:function(e,t){var n=[e,t,this.startDialogObj===undefined?null:{startDialog:{en_US:this.startDialogObj}}];A.__super__.objectiveDialog.apply(this,n)},initParseWaterfall:function(e){A.__super__.initParseWaterfall.apply(this,[e]),this.parseWaterfall.addFirst("parseWaterfall",L),this.parseWaterfall.addFirst("instantWaterfall",this.getInstantCommands())},buildLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().buildLevel(e,t)},this.getAnimationTime()*1.5)},getInstantCommands:function(){return[[/^help$|^\?$/,function(){throw new p.CommandResult({msg:h.str("help-vague-builder")})}]]},takeControl:function(){c.getEventBaton().stealBaton("processLevelBuilderCommand",this.processLevelBuilderCommand,this),A.__super__.takeControl.apply(this)},releaseControl:function(){c.getEventBaton().releaseBaton("processLevelBuilderCommand",this.processLevelBuilderCommand,this),A.__super__.releaseControl.apply(this)},showGoal:function(){this.hideStart(),A.__super__.showGoal.apply(this,arguments)},showStart:function(e,t){this.hideGoal(),this.showSideVis(e,t,this.startCanvasHolder,this.initStartVisualization)},resetSolution:function(){this.gitCommandsIssued=[],this.level.solutionCommand=undefined},hideStart:function(e,t){this.hideSideVis(e,t,this.startCanvasHolder)},defineStart:function(e,t){this.hideStart(),e.addWarning(h.str("define-start-warning")),this.resetSolution(),this.level.startTree=this.mainVis.gitEngine.printTree(),this.mainVis.resetFromThisTreeNow(this.level.startTree),this.showStart(e,t)},defineGoal:function(e,t){this.hideGoal();if(!this.gitCommandsIssued.length){e.set("error",new p.GitError({msg:h.str("solution-empty")})),t.resolve();return}this.definedGoal=!0,this.level.solutionCommand=this.gitCommandsIssued.join(";"),this.level.goalTreeString=this.mainVis.gitEngine.printTree(),this.initGoalVisualization(),this.showGoal(e,t)},defineName:function(e,t){this.level.name={en_US:prompt(h.str("prompt-name"))},e&&e.finishWith(t)},defineHint:function(e,t){this.level.hint={en_US:prompt(h.str("prompt-hint"))},e&&e.finishWith(t)},editDialog:function(e,t){var n=f.defer();this.currentBuilder=new N({multiViewJSON:this.startDialogObj,deferred:n}),n.promise.then(u.bind(function(e){this.startDialogObj=e},this)).fail(function(){}).done(function(){e?e.finishWith(t):t.resolve()})},finish:function(e,t){if(!this.gitCommandsIssued.length||!this.definedGoal){e.set("error",new p.GitError({msg:h.str("solution-empty")})),t.resolve();return}while(!this.level.name)this.defineName();var n=f.defer(),r=n.promise;if(this.level.hint===undefined){var i=f.defer();r=r.then(function(){return i.promise});var s=new E({markdowns:[h.str("want-hint")]});s.getPromise().then(u.bind(this.defineHint,this)).fail(u.bind(function(){this.level.hint={en_US:""}},this)).done(function(){i.resolve()})}if(this.startDialogObj===undefined){var o=f.defer();r=r.then(function(){return o.promise});var a=new E({markdowns:[h.str("want-start-dialog")]});a.getPromise().then(u.bind(function(){var e=f.defer();return this.editDialog(undefined,e),e.promise},this)).fail(function(){}).done(function(){o.resolve()})}r=r.done(u.bind(function(){new T({fillerText:JSON.stringify(this.getExportObj(),null,2),previewText:h.str("share-json")}),e.finishWith(t)},this)),n.resolve()},getExportObj:function(){var e=u.extend({},this.level);return delete e.startDialog,this.startDialogObj&&(e.startDialog={en_US:this.startDialogObj}),e},processLevelBuilderCommand:function(e,t){var n={"define goal":this.defineGoal,"define start":this.defineStart,"show start":this.showStart,"hide start":this.hideStart,finish:this.finish,"define hint":this.defineHint,"define name":this.defineName,"edit dialog":this.editDialog,"help builder":A.__super__.startDialog};if(!n[e.get("method")])throw new Error("woah we dont support that method yet");n[e.get("method")].apply(this,arguments)},afterCommandDefer:function(e,t){e.resolve()},die:function(){this.hideStart(),A.__super__.die.apply(this,arguments),delete this.startVis,delete this.startCanvasHolder}});n.LevelBuilder=A,n.regexMap=k}),e("/src/js/level/builder.js"),e.define("/src/js/level/disabledMap.js",function(e,t,n,r,i,s,o){function h(e){e=e||{},this.disabledMap=e.disabledMap||{"git cherry-pick":!0,"git rebase":!0}}var u=e("underscore"),a=e("../intl"),f=e("../git/commands"),l=e("../util/errors"),c=l.GitError;h.prototype.getInstantCommands=function(){var e=[],t=function(){throw new c({msg:a.str("command-disabled")})};return u.each(this.disabledMap,function(n,r){var i=f.regexMap[r];if(!i)throw new Error("wuttttt this disbaled command"+r+" has no regex matching");e.push([i,t])}),e},n.DisabledMap=h}),e("/src/js/level/disabledMap.js"),e.define("/src/js/level/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("q"),l=e("../util"),c=e("../app"),h=e("../intl"),p=e("../util/errors"),d=e("../level/sandbox").Sandbox,v=e("../util/constants"),m=e("../visuals/visualization").Visualization,g=e("../level/parseWaterfall").ParseWaterfall,y=e("../level/disabledMap").DisabledMap,b=e("../models/commandModel").Command,w=e("../git/gitShim").GitShim,E=e("../views/multiView").MultiView,S=e("../views").CanvasTerminalHolder,x=e("../views").ConfirmCancelTerminal,T=e("../views").NextLevelConfirm,N=e("../views").LevelToolbar,C=e("../git/treeCompare").TreeCompare,k={"help level":/^help level$/,"start dialog":/^start dialog$/,"show goal":/^(show goal|goal|help goal)$/,"hide goal":/^hide goal$/,"show solution":/^show solution($|\s)/,objective:/^(objective|assignment)$/},L=l.genParseCommand(k,"processLevelCommand"),A=d.extend({initialize:function(e){e=e||{},e.level=e.level||{},this.level=e.level,this.gitCommandsIssued=[],this.commandsThatCount=this.getCommandsThatCount(),this.solved=!1,this.treeCompare=new C,this.initGoalData(e),this.initName(e),A.__super__.initialize.apply(this,[e]),this.startOffCommand(),this.handleOpen(e.deferred)},handleOpen:function(e){e=e||f.defer();if(this.level.startDialog&&!this.testOption("noIntroDialog")){new E(u.extend({},h.getStartDialog(this.level),{deferred:e}));return}setTimeout(function(){e.resolve()},this.getAnimationTime()*1.2)},objectiveDialog:function(e,t,n){n=n===undefined?this.level:n;if(!n||!n.startDialog){e.set("error",new p.GitError({msg:h.str("no-start-dialog")})),t.resolve();return}var r=u.clone(h.getStartDialog(n));r.childViews=r.childViews.splice(-1),new E(u.extend(r,{deferred:t})),t.promise.then(function(){e.set("status","finished")})},startDialog:function(e,t){if(!this.level.startDialog){e.set("error",new p.GitError({msg:h.str("no-start-dialog")})),t.resolve();return}this.handleOpen(t),t.promise.then(function(){e.set("status","finished")})},initName:function(){var e=h.getName(this.level);this.levelToolbar=new N({name:e})},initGoalData:function(e){if(!this.level.goalTreeString||!this.level.solutionCommand)throw new Error("need goal tree and solution")},takeControl:function(){c.getEventBaton().stealBaton("processLevelCommand",this.processLevelCommand,this),A.__super__.takeControl.apply(this)},releaseControl:function(){c.getEventBaton().releaseBaton("processLevelCommand",this.processLevelCommand,this),A.__super__.releaseControl.apply(this)},startOffCommand:function(){this.testOption("noStartCommand")||c.getEventBaton().trigger("commandSubmitted","hint; delay 2000; show goal")},initVisualization:function(e){this.mainVis=new m({el:e.el||this.getDefaultVisEl(),treeString:e.level.startTree})},initGoalVisualization:function(){return this.goalCanvasHolder=new S,this.goalVis=new m({el:this.goalCanvasHolder.getCanvasLocation(),containerElement:this.goalCanvasHolder.getCanvasLocation(),treeString:this.level.goalTreeString,noKeyboardInput:!0,noClick:!0}),this.goalCanvasHolder},showSolution:function(t,n){var r=this.level.solutionCommand,i=u.bind(function(){this.isShowingSolution=!0,c.getEventBaton().trigger("commandSubmitted",r)},this),s=t.get("rawStr");this.testOptionOnString(s,"noReset")||(r="reset --forSolution; "+r);if(this.testOptionOnString(s,"force")){i(),t.finishWith(n);return}var o=f.defer(),a=h.getDialog(e("../dialogs/confirmShowSolution"))[0],l=new x({markdowns:a.options.markdowns,deferred:o});o.promise.then(i).fail(function(){t.setResult("")}).done(function(){setTimeout(function(){t.finishWith(n)},l.getAnimationTime())})},showGoal:function(e,t){this.showSideVis(e,t,this.goalCanvasHolder,this.initGoalVisualization)},showSideVis:function(e,t,n,r){var i=function(){e&&e.finishWith(t)};if(!n||!n.inDom)n=r.apply(this);n.slideIn(),setTimeout(i,n.getAnimationTime())},hideGoal:function(e,t){this.hideSideVis(e,t,this.goalCanvasHolder)},hideSideVis:function(e,t,n,r){var i=function(){e&&e.finishWith(t)};n&&n.inDom?(n.die(),setTimeout(i,n.getAnimationTime())):i()},initParseWaterfall:function(e){A.__super__.initParseWaterfall.apply(this,[e]),this.parseWaterfall.addFirst("parseWaterfall",L),this.parseWaterfall.addFirst("instantWaterfall",this.getInstantCommands()),e.level.disabledMap&&this.parseWaterfall.addFirst("instantWaterfall",(new y({disabledMap:e.level.disabledMap})).getInstantCommands())},initGitShim:function(e){this.gitShim=new w({beforeCB:u.bind(this.beforeCommandCB,this),afterCB:u.bind(this.afterCommandCB,this),afterDeferHandler:u.bind(this.afterCommandDefer,this)})},getCommandsThatCount:function(){var t=e("../git/commands"),n=["git commit","git checkout","git rebase","git reset","git branch","git revert","git merge","git cherry-pick"],r={};return u.each(n,function(e){if(!t.regexMap[e])throw new Error("wut no regex");r[e]=t.regexMap[e]}),r},undo:function(){this.gitCommandsIssued.pop(),A.__super__.undo.apply(this,arguments)},afterCommandCB:function(e){if(e.get("error"))return;var t=!1;u.each(this.commandsThatCount,function(n){t=t||n.test(e.get("rawStr"))}),t&&this.gitCommandsIssued.push(e.get("rawStr"))},afterCommandDefer:function(e,t){if(this.solved){t.addWarning(h.str("already-solved")),e.resolve();return}var n=this.mainVis.gitEngine.exportTree(),r;this.level.compareOnlyMaster?r=this.treeCompare.compareBranchWithinTrees(n,this.level.goalTreeString,"master"):this.level.compareOnlyBranches?r=this.treeCompare.compareAllBranchesWithinTrees(n,this.level.goalTreeString):this.level.compareAllBranchesHashAgnostic?r=this.treeCompare.compareAllBranchesWithinTreesHashAgnostic(n,this.level.goalTreeString):this.level.compareOnlyMasterHashAgnostic?r=this.treeCompare.compareBranchesWithinTreesHashAgnostic(n,this.level.goalTreeString,["master"]):this.level.compareOnlyMasterHashAgnosticWithAsserts?(r=this.treeCompare.compareBranchesWithinTreesHashAgnostic(n,this.level.goalTreeString,["master"]),r=r&&this.treeCompare.evalAsserts(n,this.level.goalAsserts)):r=this.treeCompare.compareAllBranchesWithinTreesAndHEAD(n,this.level.goalTreeString);if(!r){e.resolve();return}this.levelSolved(e)},getNumSolutionCommands:function(){var e=this.level.solutionCommand.replace(/^;|;$/g,"");return e.split(";").length},testOption:function(e){return this.options.command&&(new RegExp("--"+e)).test(this.options.command.get("rawStr"))},testOptionOnString:function(e,t){return e&&(new RegExp("--"+t)).test(e)},levelSolved:function(e){this.solved=!0,this.isShowingSolution||c.getEvents().trigger("levelSolved",this.level.id),this.hideGoal();var t=c.getLevelArbiter().getNextLevel(this.level.id),n=this.gitCommandsIssued.length,r=this.getNumSolutionCommands();v.GLOBAL.isAnimating=!0;var i=this.testOption("noFinishDialog"),s=this.mainVis.gitVisuals.finishAnimation();i||(s=s.then(function(){var e=new T({nextLevel:t,numCommands:n,best:r});return e.getPromise()})),s.then(function(){!i&&t&&c.getEventBaton().trigger("commandSubmitted","level "+t.id)}).fail(function(){}).done(function(){v.GLOBAL.isAnimating=!1,e.resolve()})},die:function(){this.levelToolbar.die(),this.hideGoal(),this.mainVis.die(),this.releaseControl(),this.clear(),delete this.commandCollection,delete this.mainVis,delete this.goalVis,delete this.goalCanvasHolder},getInstantCommands:function(){var e=u.bind(function(){var e=h.getHint(this.level);return!e||!e.length?h.str("no-hint"):e},this);return[[/^help$|^\?$/,function(){throw new p.CommandResult({msg:h.str("help-vague-level")})}],[/^hint$/,function(){throw new p.CommandResult({msg:e()})}]]},reset:function(e,t){this.gitCommandsIssued=[];var n=e?e.get("rawStr"):"";this.testOptionOnString(n,"forSolution")||(this.isShowingSolution=!1),this.solved=!1,A.__super__.reset.apply(this,arguments)},buildLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().buildLevel(e,t)},this.getAnimationTime()*1.5)},importLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().importLevel(e,t)},this.getAnimationTime()*1.5)},startLevel:function(e,t){this.exitLevel(),setTimeout(function(){c.getSandbox().startLevel(e,t)},this.getAnimationTime()*1.5)},exitLevel:function(e,t){this.die();if(!e||!t)return;setTimeout(function(){e.finishWith(t)},this.getAnimationTime()),c.getEventBaton().trigger("levelExited")},processLevelCommand:function(e,t){var n={"show goal":this.showGoal,"hide goal":this.hideGoal,"show solution":this.showSolution,"start dialog":this.startDialog,"help level":this.startDialog,objective:this.objectiveDialog},r=n[e.get("method")];if(!r)throw new Error("woah we dont support that method yet",r);r.apply(this,[e,t])}});n.Level=A,n.regexMap=k}),e("/src/js/level/index.js"),e.define("/src/js/level/parseWaterfall.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../git/commands"),f=e("../level/sandboxCommands"),l=function(e){e=e||{},this.options=e,this.shortcutWaterfall=e.shortcutWaterfall||[a.shortcutMap],this.instantWaterfall=e.instantWaterfall||[a.instantCommands,f.instantCommands]};l.prototype.initParseWaterfall=function(){if(!e("../util").isBrowser()){this.parseWaterfall=[a.parse];return}this.parseWaterfall=this.options.parseWaterfall||[a.parse,f.parse,f.getOptimisticLevelParse(),f.getOptimisticLevelBuilderParse()]},l.prototype.clone=function(){return new l({shortcutWaterfall:this.shortcutWaterfall.slice(),instantWaterfall:this.instantWaterfall.slice(),parseWaterfall:this.parseWaterfall.slice()})},l.prototype.getWaterfallMap=function(){return this.parseWaterfall||this.initParseWaterfall(),{shortcutWaterfall:this.shortcutWaterfall,instantWaterfall:this.instantWaterfall,parseWaterfall:this.parseWaterfall}},l.prototype.addFirst=function(e,t){if(!e||!t)throw new Error("need to know which!!!");this.getWaterfallMap()[e].unshift(t)},l.prototype.addLast=function(e,t){this.getWaterfallMap()[e].push(t)},l.prototype.expandAllShortcuts=function(e){return u.each(this.shortcutWaterfall,function(t){e=this.expandShortcut(e,t)},this),e},l.prototype.expandShortcut=function(e,t){return u.each(t,function(t,n){var r=t.exec(e);r&&(e=n+" "+e.slice(r[0].length))}),e},l.prototype.processAllInstants=function(e){u.each(this.instantWaterfall,function(t){this.processInstant(e,t)},this)},l.prototype.processInstant=function(e,t){u.each(t,function(t){var n=t[0],r=n.exec(e);r&&t[1](r)})},l.prototype.parseAll=function(e){this.parseWaterfall||this.initParseWaterfall();var t=!1;return u.each(this.parseWaterfall,function(n){var r=n(e);r&&(t=r)},this),t},n.ParseWaterfall=l}),e("/src/js/level/parseWaterfall.js"),e.define("/src/js/level/sandbox.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../intl"),h=e("../app"),p=e("../util/errors"),d=e("../visuals/visualization").Visualization,v=e("../level/parseWaterfall").ParseWaterfall,m=e("../level/disabledMap").DisabledMap,g=e("../models/commandModel").Command,y=e("../git/gitShim").GitShim,b=e("../views"),w=b.ModalTerminal,E=b.ModalAlert,S=e("../views/builderViews"),x=e("../views/multiView").MultiView,T=f.View.extend({tagName:"div",initialize:function(e){e=e||{},this.options=e,this.initVisualization(e),this.initCommandCollection(e),this.initParseWaterfall(e),this.initGitShim(e),this.initUndoStack(e),e.wait||this.takeControl()},getDefaultVisEl:function(){return $("#mainVisSpace")[0]},getAnimationTime:function(){return 1050},initVisualization:function(e){this.mainVis=new d({el:e.el||this.getDefaultVisEl()})},initUndoStack:function(e){this.undoStack=[]},initCommandCollection:function(e){this.commandCollection=h.getCommandUI().commandCollection},initParseWaterfall:function(e){this.parseWaterfall=new v},initGitShim:function(e){this.gitShim=new y({beforeCB:u.bind(this.beforeCommandCB,this)})},takeControl:function(){h.getEventBaton().stealBaton("commandSubmitted",this.commandSubmitted,this),h.getEventBaton().stealBaton("processSandboxCommand",this.processSandboxCommand,this),h.getEventBaton().stealBaton("levelExited",this.levelExited,this),this.insertGitShim()},releaseControl:function(){h.getEventBaton().releaseBaton("commandSubmitted",this.commandSubmitted,this),h.getEventBaton().releaseBaton("processSandboxCommand",this.processSandboxCommand,this),h.getEventBaton().releaseBaton("levelExited",this.levelExited,this),this.releaseGitShim()},releaseGitShim:function(){this.gitShim&&this.gitShim.removeShim()},insertGitShim:function(){this.gitShim&&this.mainVis.customEvents.on("gitEngineReady",function(){this.gitShim.insertShim()},this)},beforeCommandCB:function(e){this.pushUndo()},pushUndo:function(){this.undoStack.push(this.mainVis.gitEngine.printTree())},undo:function(e,t){var n=this.undoStack.pop();if(!n){e.set("error",new p.GitError({msg:c.str("undo-stack-empty")})),t.resolve();return}this.mainVis.reset(n),setTimeout(function(){e.finishWith(t)},this.mainVis.getAnimationTime())},commandSubmitted:function(e){h.getEvents().trigger("commandSubmittedPassive",e),l.splitTextCommand(e,function(e){this.commandCollection.add(new g({rawStr:e,parseWaterfall:this.parseWaterfall}))},this)},startLevel:function(t,n){var r=t.get("regexResults")||[],i=r[1]||"",s=h.getLevelArbiter().getLevel(i);if(!s){t.addWarning(c.str("level-no-id",{id:i})),h.getEventBaton().trigger("commandSubmitted","levels"),t.set("status","error"),n.resolve();return}this.hide(),this.clear();var o=a.defer(),u=e("../level").Level;this.currentLevel=new u({level:s,deferred:o,command:t}),o.promise.then(function(){t.finishWith(n)})},buildLevel:function(t,n){this.hide(),this.clear();var r=a.defer(),i=e("../level/builder").LevelBuilder;this.levelBuilder=new i({deferred:r}),r.promise.then(function(){t.finishWith(n)})},exitLevel:function(e,t){e.addWarning(c.str("level-cant-exit")),e.set("status","error"),t.resolve()},showLevels:function(e,t){var n=a.defer();h.getLevelDropdown().show(n,e),n.promise.done(function(){e.finishWith(t)})},resetSolved:function(e,t){h.getLevelArbiter().resetSolvedMap(),e.addWarning(c.str("solved-map-reset")),e.finishWith(t)},processSandboxCommand:function(e,t){var n={"reset solved":this.resetSolved,undo:this.undo,"help general":this.helpDialog,help:this.helpDialog,reset:this.reset,delay:this.delay,clear:this.clear,"exit level":this.exitLevel,level:this.startLevel,sandbox:this.exitLevel,levels:this.showLevels,mobileAlert:this.mobileAlert,"build level":this.buildLevel,"export tree":this.exportTree,"import tree":this.importTree,"import level":this.importLevel},r=n[e.get("method")];if(!r)throw new Error("no method for that wut");r.apply(this,[e,t])},hide:function(){this.mainVis.hide()},levelExited:function(){this.show()},show:function(){this.mainVis.show()},importTree:function(e,t){var n=new S.MarkdownPresenter({previewText:c.str("paste-json"),fillerText:" "});n.deferred.promise.then(u.bind(function(e){try{this.mainVis.gitEngine.loadTree(JSON.parse(e))}catch(t){this.mainVis.reset(),new x({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that JSON! Here is the error:","",String(t)]}}]})}},this)).fail(function(){}).done(function(){e.finishWith(t)})},importLevel:function(t,n){var r=new S.MarkdownPresenter({previewText:c.str("paste-json"),fillerText:" "});r.deferred.promise.then(u.bind(function(r){var i=e("../level").Level;try{var s=JSON.parse(r),o=a.defer();this.currentLevel=new i({level:s,deferred:o,command:t}),this.hide(),o.promise.then(function(){t.finishWith(n)})}catch(u){new x({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that level JSON, this happened:","",String(u)]}}]}),t.finishWith(n)}},this)).fail(function(){t.finishWith(n)}).done()},exportTree:function(e,t){var n=JSON.stringify(this.mainVis.gitEngine.exportTree(),null,2),r=new x({childViews:[{type:"MarkdownPresenter",options:{previewText:c.str("share-tree"),fillerText:n,noConfirmCancel:!0}}]});r.getPromise().then(function(){e.finishWith(t)}).done()},clear:function(e,t){h.getEvents().trigger("clearOldCommands"),e&&t&&e.finishWith(t)},mobileAlert:function(e,t){alert(c.str("mobile-alert")),e.finishWith(t)},delay:function(e,t){var n=parseInt(e.get("regexResults")[1],10);setTimeout(function(){e.finishWith(t)},n)},reset:function(e,t){this.mainVis.reset(),this.initUndoStack(),setTimeout(function(){e.finishWith(t)},this.mainVis.getAnimationTime())},helpDialog:function(t,n){var r=new x({childViews:c.getDialog(e("../dialogs/sandbox"))});r.getPromise().then(u.bind(function(){t.finishWith(n)},this)).done()}});n.Sandbox=T}),e("/src/js/level/sandbox.js"),e.define("/src/js/level/sandboxCommands.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util"),f=e("../util/constants"),l=e("../intl"),c=e("../util/errors"),h=c.CommandProcessError,p=c.GitError,d=c.Warning,v=c.CommandResult,m=[[/^ls/,function(){throw new v({msg:l.str("ls-command")})}],[/^cd/,function(){throw new v({msg:l.str("cd-command")})}],[/^(locale|locale reset)$/,function(t){f.GLOBAL.locale=l.getDefaultLocale();var n=e("../app").getEvents().trigger("localeChanged");throw new v({msg:l.str("locale-reset-command",{locale:l.getDefaultLocale()})})}],[/^show$/,function(e){var t=[l.str("show-command"),"<br/>","show commands","show solution","show goal"];throw new v({msg:t.join("\n")})}],[/^locale (\w+)$/,function(t){f.GLOBAL.locale=t[1];var n=e("../app").getEvents().trigger("localeChanged");throw new v({msg:l.str("locale-command",{locale:t[1]})})}],[/^refresh$/,function(){var t=e("../app").getEvents();throw t.trigger("refreshTree"),new v({msg:l.str("refresh-tree-command")})}],[/^rollup (\d+)$/,function(t){var n=e("../app").getEvents();throw n.trigger("rollupCommands",t[1]),new v({msg:"Commands combined!"})}],[/^echo "(.*?)"$|^echo (.*?)$/,function(e){var t=e[1]||e[2];throw new v({msg:t})}],[/^show +commands$/,function(e){var t=y(),n=[l.str("show-all-commands"),"<br/>"];throw u.each(t,function(e,t){n.push(t)}),new v({msg:n.join("\n")})}]],g={"reset solved":/^reset solved($|\s)/,help:/^help( +general)?$|^\?$/,reset:/^reset( +--forSolution)?$/,delay:/^delay (\d+)$/,clear:/^clear($|\s)/,"exit level":/^exit level($|\s)/,sandbox:/^sandbox($|\s)/,level:/^level\s?([a-zA-Z0-9]*)/,levels:/^levels($|\s)/,mobileAlert:/^mobile alert($|\s)/,"build level":/^build +level($|\s)/,"export tree":/^export +tree$/,"import tree":/^import +tree$/,"import level":/^import +level$/,undo:/^undo($|\s)/},y=function(){var t=["mobileAlert"],n=u.extend({},e("../git/commands").regexMap,e("../level").regexMap,g);return u.each(t,function(e){delete n[e]}),n};n.instantCommands=m,n.parse=a.genParseCommand(g,"processSandboxCommand"),n.getOptimisticLevelParse=function(){return a.genParseCommand(e("../level").regexMap,"processLevelCommand")},n.getOptimisticLevelBuilderParse=function(){return a.genParseCommand(e("../level/builder").regexMap,"processLevelBuilderCommand")}}),e("/src/js/level/sandboxCommands.js"),e.define("/src/js/models/collections.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?f=window.Backbone:f=e("backbone"),l=e("../git").Commit,c=e("../git").Branch,h=e("../models/commandModel").Command,p=e("../models/commandModel").CommandEntry,d=e("../util/constants").TIME,v=f.Collection.extend({model:l}),m=f.Collection.extend({model:h}),g=f.Collection.extend({model:c}),y=f.Collection.extend({model:p,localStorage:f.LocalStorage?new f.LocalStorage("CommandEntries"):null}),b=f.Model.extend({defaults:{collection:null},initialize:function(e){e.collection.bind("add",this.addCommand,this),this.buffer=[],this.timeout=null},addCommand:function(e){this.buffer.push(e),this.touchBuffer()},touchBuffer:function(){if(this.timeout)return;this.setTimeout()},setTimeout:function(){this.timeout=setTimeout(u.bind(function(){this.sipFromBuffer()},this),d.betweenCommandsDelay)},popAndProcess:function(){var e=this.buffer.shift(0);while(e.get("error")&&this.buffer.length)e=this.buffer.shift(0);e.get("error")?this.clear():this.processCommand(e)},processCommand:function(t){t.set("status","processing");var n=a.defer();n.promise.then(u.bind(function(){this.setTimeout()},this));var r=t.get("eventName");if(!r)throw new Error("I need an event to trigger when this guy is parsed and ready");var i=e("../app"),s=i.getEventBaton(),o=s.getNumListeners(r);if(!o){var f=e("../util/errors");t.set("error",new f.GitError({msg:"That command is valid, but not supported in this current environment! Try entering a level or level builder to use that command"})),n.resolve();return}i.getEventBaton().trigger(r,t,n)},clear:function(){clearTimeout(this.timeout),this.timeout=null},sipFromBuffer:function(){if(!this.buffer.length){this.clear();return}this.popAndProcess()}});n.CommitCollection=v,n.CommandCollection=m,n.BranchCollection=g,n.CommandEntryCollection=y,n.CommandBuffer=b}),e("/src/js/models/collections.js"),e.define("/src/js/models/commandModel.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../util/errors"),l=e("../git/commands"),c=l.GitOptionParser,h=e("../level/parseWaterfall").ParseWaterfall,p=f.CommandProcessError,d=f.GitError,v=f.Warning,m=f.CommandResult,g=a.Model.extend({defaults:{status:"inqueue",rawStr:null,result:"",createTime:null,error:null,warnings:null,parseWaterfall:new h,generalArgs:null,supportedMap:null,options:null,method:null},initialize:function(e){this.initDefaults(),this.validateAtInit(),this.on("change:error",this.errorChanged,this),this.get("error")&&this.errorChanged(),this.parseOrCatch()},initDefaults:function(){this.set("generalArgs",[]),this.set("supportedMap",{}),this.set("warnings",[])},validateAtInit:function(){if(this.get("rawStr")===null)throw new Error("Give me a string!");this.get("createTime")||this.set("createTime",(new Date).toString())},setResult:function(e){this.set("result",e)},finishWith:function(e){this.set("status","finished"),e.resolve()},addWarning:function(e){this.get("warnings").push(e),this.set("numWarnings",this.get("numWarnings")?this.get("numWarnings")+1:1)},getFormattedWarnings:function(){if(!this.get("warnings").length)return"";var e='<i class="icon-exclamation-sign"></i>';return"<p>"+e+this.get("warnings").join("</p><p>"+e)+"</p>"},parseOrCatch:function(){this.expandShortcuts(this.get("rawStr"));try{this.processInstants()}catch(e){f.filterError(e),this.set("error",e);return}if(this.parseAll())return;this.set("error",new p({msg:'The command "'+this.get("rawStr")+"\" isn't supported, sorry!"}))},errorChanged:function(){var e=this.get("error");e instanceof p||e instanceof d?this.set("status","error"):e instanceof m?this.set("status","finished"):e instanceof v&&this.set("status","warning"),this.formatError()},formatError:function(){this.set("result",this.get("error").toResult())},expandShortcuts:function(e){e=this.get("parseWaterfall").expandAllShortcuts(e),this.set("rawStr",e)},processInstants:function(){var e=this.get("rawStr");if(!e.length)throw new m({msg:""});this.get("parseWaterfall").processAllInstants(e)},parseAll:function(){var e=this.get("rawStr"),t=this.get("parseWaterfall").parseAll(e);return t?(u.each(t.toSet,function(e,t){this.set(t,e)},this),!0):!1}}),y=a.Model.extend({defaults:{text:""}});n.CommandEntry=y,n.Command=g}),e("/src/js/models/commandModel.js"),e.define("/src/js/util/constants.js",function(e,t,n,r,i,s,o){var u={betweenCommandsDelay:400},a={isAnimating:!1},f={minZoom:.55,maxZoom:1.25,minWidth:600,minHeight:600},l={arrowHeadSize:8,nodeRadius:17,curveControlPointOffset:50,defaultEasing:"easeInOut",defaultAnimationTime:400,rectFill:"hsb(0.8816909813322127,0.7,1)",headRectFill:"#2831FF",rectStroke:"#FFF",rectStrokeWidth:"3",multiBranchY:20,upstreamHeadOpacity:.5,upstreamNoneOpacity:.2,edgeUpstreamHeadOpacity:.4,edgeUpstreamNoneOpacity:.15,visBranchStrokeWidth:2,visBranchStrokeColorNone:"#333",defaultNodeFill:"hsba(0.5,0.8,0.7,1)",defaultNodeStrokeWidth:2,defaultNodeStroke:"#FFF",orphanNodeFill:"hsb(0.5,0.8,0.7)"};n.GLOBAL=a,n.TIME=u,n.GRAPHICS=l,n.VIEWPORT=f}),e("/src/js/util/constants.js"),e.define("/src/js/util/debug.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a={Tree:e("../visuals/tree"),Visuals:e("../visuals"),Git:e("../git"),CommandModel:e("../models/commandModel"),Levels:e("../git/treeCompare"),Constants:e("../util/constants"),Collections:e("../models/collections"),Async:e("../visuals/animation"),AnimationFactory:e("../visuals/animation/animationFactory"),Main:e("../app"),HeadLess:e("../git/headless"),Q:{Q:e("q")},RebaseView:e("../views/rebaseView"),Views:e("../views"),MultiView:e("../views/multiView"),ZoomLevel:e("../util/zoomLevel"),VisBranch:e("../visuals/visBranch"),Level:e("../level"),Sandbox:e("../level/sandbox"),GitDemonstrationView:e("../views/gitDemonstrationView"),Markdown:e("markdown"),LevelDropdownView:e("../views/levelDropdownView"),BuilderViews:e("../views/builderViews"),Intl:e("../intl")};u.each(a,function(e){u.extend(window,e)}),$(document).ready(function(){window.events=a.Main.getEvents(),window.eventBaton=a.Main.getEventBaton(),window.sandbox=a.Main.getSandbox(),window.modules=a,window.levelDropdown=a.Main.getLevelDropdown()})}),e("/src/js/util/debug.js"),e.define("/src/js/util/errors.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({defaults:{type:"MyError",msg:"Unknown Error"},toString:function(){return this.get("type")+": "+this.get("msg")},getMsg:function(){return this.get("msg")||"Unknown Error"},toResult:function(){return this.get("msg").length?"<p>"+this.get("msg").replace(/\n/g,"</p><p>")+"</p>":""}}),l=n.CommandProcessError=f.extend({defaults:{type:"Command Process Error"}}),c=n.CommandResult=f.extend({defaults:{type:"Command Result"}}),h=n.Warning=f.extend({defaults:{type:"Warning"}}),p=n.GitError=f.extend({defaults:{type:"Git Error"}}),d=function(e){if(e instanceof l||e instanceof p||e instanceof c||e instanceof h)return;throw e};n.filterError=d}),e("/src/js/util/errors.js"),e.define("/src/js/util/eventBaton.js",function(e,t,n,r,i,s,o){function a(){this.eventMap={}}var u=e("underscore");a.prototype.stealBaton=function(e,t,n){if(!e)throw new Error("need name");if(!t)throw new Error("need func!");var r=this.eventMap[e]||[];r.push({func:t,context:n}),this.eventMap[e]=r},a.prototype.sliceOffArgs=function(e,t){var n=[];for(var r=e;r<t.length;r++)n.push(t[r]);return n},a.prototype.trigger=function(e){var t=this.sliceOffArgs(1,arguments),n=this.eventMap[e];if(!n||!n.length){console.warn("no listeners for",e);return}var r=n.slice(-1)[0];r.func.apply(r.context,t)},a.prototype.getNumListeners=function(e){var t=this.eventMap[e]||[];return t.length},a.prototype.getListenersThrow=function(e){var t=this.eventMap[e];if(!t||!t.length)throw new Error("no one has that baton!"+e);return t},a.prototype.passBatonBackSoft=function(e,t,n,r){try{return this.passBatonBack(e,t,n,r)}catch(i){}},a.prototype.passBatonBack=function(e,t,n,r){var i=this.getListenersThrow(e),s;u.each(i,function(e,r){if(r===0)return;e.func===t&&e.context===n&&(s=r-1)},this);if(s===undefined)throw new Error("you are the last baton holder! or i didnt find you");var o=i[s];o.func.apply(o.context,r)},a.prototype.releaseBaton=function(e,t,n){var r=this.getListenersThrow(e),i=[],s=!1;u.each(r,function(e){e.func===t&&e.context===n?(s&&(console.warn("woah duplicates!!!"),console.log(r)),s=!0):i.push(e)},this);if(!s)throw console.log("did not find that function",t,n,e,arguments),console.log(this.eventMap),new Error("cant releasebaton if yu dont have it");this.eventMap[e]=i},n.EventBaton=a}),e("/src/js/util/eventBaton.js"),e.define("/src/js/util/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util/constants");n.parseQueryString=function(e){var t={};return e.replace(new RegExp("([^?=&]+)(=([^&]*))?","g"),function(e,n,r,i){t[n]=i}),t},n.isBrowser=function(){var e=String(typeof window)!=="undefined";return e},n.splitTextCommand=function(e,t,n){t=u.bind(t,n),u.each(e.split(";"),function(e,n){e=u.escape(e),e=e.replace(/^(\s+)/,"").replace(/(\s+)$/,"").replace(/&quot;/g,'"').replace(/&#x27;/g,"'");if(n>0&&!e.length)return;t(e)})},n.genParseCommand=function(e,t){return function(n){var r,i;return u.each(e,function(e,t){var s=e.exec(n);s&&(r=t,i=s)}),r?{toSet:{eventName:t,method:r,regexResults:i}}:!1}}}),e("/src/js/util/index.js"),e.define("/src/js/util/keyboard.js",function(e,t,n,r,i,s,o){function c(e){this.events=e.events||u.clone(a.Events),this.aliasMap=e.aliasMap||{},e.wait||this.listen()}var u=e("underscore"),a=e("backbone"),f=e("../app"),l=function(e){var t={37:"left",38:"up",39:"right",40:"down",27:"esc",13:"enter"};return t[e]};c.prototype.listen=function(){if(this.listening)return;this.listening=!0,f.getEventBaton().stealBaton("docKeydown",this.keydown,this)},c.prototype.mute=function(){this.listening=!1,f.getEventBaton().releaseBaton("docKeydown",this.keydown,this)},c.prototype.keydown=function(e){var t=e.which||e.keyCode,n=l(t);if(n===undefined)return;this.fireEvent(n,e)},c.prototype.fireEvent=function(e,t){e=this.aliasMap[e]||e,this.events.trigger(e,t)},c.prototype.passEventBack=function(e){f.getEventBaton().passBatonBackSoft("docKeydown",this.keydown,this,[e])},n.KeyboardListener=c,n.mapKeycodeToKey=l}),e("/src/js/util/keyboard.js"),e.define("/src/js/util/mock.js",function(e,t,n,r,i,s,o){n.mock=function(e){var t={},n=function(){};for(var r in e.prototype)t[r]=n;return t}}),e("/src/js/util/mock.js"),e.define("/src/js/util/zoomLevel.js",function(e,t,n,r,i,s,o){function f(){return!window.outerWidth||!window.innerWidth?(a&&(console.warn("Can't detect zoom level correctly :-/"),a=!1),1):window.outerWidth/window.innerWidth}var u=e("underscore"),a=!0,l=!0,c=function(e,t){var n=0;setInterval(function(){var r=f();if(r!==n){if(l){l=!1;return}n=r,e.apply(t,[r])}else l=!0},500)};n.setupZoomPoll=c,n.detectZoom=f}),e("/src/js/util/zoomLevel.js"),e.define("/src/js/views/builderViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../intl"),h=e("../util/keyboard").KeyboardListener,p=e("../views"),d=p.ModalTerminal,v=p.ContainedBase,m=v.extend({tagName:"div",className:"textGrabber box vertical",template:u.template($("#text-grabber").html()),initialize:function(e){e=e||{},this.JSON={helperText:e.helperText||"Enter some text"},this.container=e.container||new d({title:"Enter some text"}),this.render(),e.initialText&&this.setText(e.initialText),e.wait||this.show()},getText:function(){return this.$("textarea").val()},setText:function(e){this.$("textarea").val(e)}}),g=v.extend({tagName:"div",className:"markdownGrabber box horizontal",template:u.template($("#markdown-grabber-view").html()),events:{"keyup textarea":"keyup"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),e.fromObj&&(e.fillerText=e.fromObj.options.markdowns.join("\n")),this.JSON={previewText:e.previewText||"Preview",fillerText:e.fillerText||"## Enter some markdown!\n\n\n"},this.container=e.container||new d({title:e.title||"Enter some markdown"}),this.render();if(!e.withoutButton){var t=a.defer();t.promise.then(u.bind(this.confirmed,this)).fail(u.bind(this.cancelled,this)).done();var n=new p.ConfirmCancelView({deferred:t,destination:this.getDestination()})}this.updatePreview(),e.wait||this.show()},confirmed:function(){this.die(),this.deferred.resolve(this.getRawText())},cancelled:function(){this.die(),this.deferred.resolve()},keyup:function(){this.throttledPreview||(this.throttledPreview=u.throttle(u.bind(this.updatePreview,this),500)),this.throttledPreview()},getRawText:function(){return this.$("textarea").val()},exportToArray:function(){return this.getRawText().split("\n")},getExportObj:function(){return{markdowns:this.exportToArray()}},updatePreview:function(){var t=this.getRawText(),n=e("markdown").markdown.toHTML(t);this.$("div.insidePreview").html(n)}}),y=v.extend({tagName:"div",className:"markdownPresenter box vertical",template:u.template($("#markdown-presenter").html()),initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.JSON={previewText:e.previewText||"Here is something for you",fillerText:e.fillerText||"# Yay"},this.container=new d({title:"Check this out..."}),this.render();if(!e.noConfirmCancel){var t=new p.ConfirmCancelView({destination:this.getDestination()});t.deferred.promise.then(u.bind(function(){this.deferred.resolve(this.grabText())},this)).fail(u.bind(function(){this.deferred.reject()},this)).done(u.bind(this.die,this))}this.show()},grabText:function(){return this.$("textarea").val()}}),b=v.extend({tagName:"div",className:"demonstrationBuilder box vertical",template:u.template($("#demonstration-builder").html()),events:{"click div.testButton":"testView"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer();if(e.fromObj){var t=e.fromObj.options;e=u.extend({},e,t,{beforeMarkdown:t.beforeMarkdowns.join("\n"),afterMarkdown:t.afterMarkdowns.join("\n")})}this.JSON={},this.container=new d({title:"Demonstration Builder"}),this.render(),this.beforeMarkdownView=new g({container:this,withoutButton:!0,fillerText:e.beforeMarkdown,previewText:"Before demonstration Markdown"}),this.beforeCommandView=new m({container:this,helperText:"The git command(s) to set up the demonstration view (before it is displayed)",initialText:e.beforeCommand||"git checkout -b bugFix"}),this.commandView=new m({container:this,helperText:"The git command(s) to demonstrate to the reader",initialText:e.command||"git commit"}),this.afterMarkdownView=new g({container:this,withoutButton:!0,fillerText:e.afterMarkdown,previewText:"After demonstration Markdown"});var n=a.defer(),r=new p.ConfirmCancelView({deferred:n,destination:this.getDestination()});n.promise.then(u.bind(this.confirmed,this)).fail(u.bind(this.cancelled,this)).done()},testView:function(){var t=e("../views/multiView").MultiView;new t({childViews:[{type:"GitDemonstrationView",options:this.getExportObj()}]})},getExportObj:function(){return{beforeMarkdowns:this.beforeMarkdownView.exportToArray(),afterMarkdowns:this.afterMarkdownView.exportToArray(),command:this.commandView.getText(),beforeCommand:this.beforeCommandView.getText()}},confirmed:function(){this.die(),this.deferred.resolve(this.getExportObj())},cancelled:function(){this.die(),this.deferred.resolve()},getInsideElement:function(){return this.$(".insideBuilder")[0]}}),w=v.extend({tagName:"div",className:"multiViewBuilder box vertical",template:u.template($("#multi-view-builder").html()),typeToConstructor:{ModalAlert:g,GitDemonstrationView:b},events:{"click div.deleteButton":"deleteOneView","click div.testButton":"testOneView","click div.editButton":"editOneView","click div.testEntireView":"testEntireView","click div.addView":"addView","click div.saveView":"saveView","click div.cancelView":"cancel"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.multiViewJSON=e.multiViewJSON||{},this.JSON={views:this.getChildViews(),supportedViews:u.keys(this.typeToConstructor)},this.container=new d({title:"Build a MultiView!"}),this.render(),this.show()},saveView:function(){this.hide(),this.deferred.resolve(this.multiViewJSON)},cancel:function(){this.hide(),this.deferred.resolve()},addView:function(e){var t=e.target,n=$(t).attr("data-type"),r=a.defer(),i=this.typeToConstructor[n],s=new i({deferred:r});r.promise.then(u.bind(function(){var e={type:n,options:s.getExportObj()};this.addChildViewObj(e)},this)).fail(function(){}).done()},testOneView:function(t){var n=t.target,r=$(n).attr("data-index"),i=this.getChildViews()[r],s=e("../views/multiView").MultiView;new s({childViews:[i]})},testEntireView:function(){var t=e("../views/multiView").MultiView;new t({childViews:this.getChildViews()})},editOneView:function(e){var t=e.target,n=$(t).attr("data-index"),r=$(t).attr("data-type"),i=a.defer(),s=new this.typeToConstructor[r]({deferred:i,fromObj:this.getChildViews()[n]});i.promise.then(u.bind(function(){var e={type:r,options:s.getExportObj()},t=this.getChildViews();t[n]=e,this.setChildViews(t)},this)).fail(function(){}).done()},deleteOneView:function(e){var t=e.target,n=$(t).attr("data-index"),r=this.getChildViews(),i=r.slice(0,n).concat(r.slice(n+1));this.setChildViews(i),this.update()},addChildViewObj:function(e,t){var n=this.getChildViews();n.push(e),this.setChildViews(n),this.update()},setChildViews:function(e){this.multiViewJSON.childViews=e},getChildViews:function(){return this.multiViewJSON.childViews||[]},update:function(){this.JSON.views=this.getChildViews(),this.renderAgain()}});n.MarkdownGrabber=g,n.DemonstrationBuilder=b,n.TextGrabber=m,n.MultiViewBuilder=w,n.MarkdownPresenter=y}),e("/src/js/views/builderViews.js"),e.define("/src/js/views/commandViews.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections").CommandEntryCollection,l=e("../app"),c=e("../models/commandModel").Command,h=e("../models/commandModel").CommandEntry,p=e("../util/errors"),d=p.Warning,v=e("../util"),m=e("../util/keyboard"),g=a.View.extend({initialize:function(e){l.getEvents().on("commandSubmittedPassive",this.addToCommandHistory,this),this.commands=new f,this.commands.fetch({success:u.bind(function(){var e=[];this.commands.each(function(t){e.push(t)}),e.reverse(),this.commands.reset(),u.each(e,function(e){this.commands.add(e)},this)},this)}),this.index=-1,this.commandParagraph=this.$("#prompt p.command")[0],this.commandCursor=this.$("#prompt span.cursor")[0],this.focus(),l.getEvents().on("rollupCommands",this.rollupCommands,this),l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this)},events:{"blur #commandTextField":"hideCursor","focus #commandTextField":"showCursor"},blur:function(){this.hideCursor()},focus:function(){this.$("#commandTextField").focus(),this.showCursor()},hideCursor:function(){this.toggleCursor(!1)},showCursor:function(){this.toggleCursor(!0)},toggleCursor:function(e){$(this.commandCursor).toggleClass("shown",e)},onKeyDown:function(e){var t=e.target;this.updatePrompt(t)},onKeyUp:function(e){this.onKeyDown(e);var t={enter:u.bind(function(){this.submit()},this),up:u.bind(function(){this.commandSelectChange(1)},this),down:u.bind(function(){this.commandSelectChange(-1)},this)},n=m.mapKeycodeToKey(e.which||e.keyCode);t[n]!==undefined&&(e.preventDefault(),t[n](),this.onKeyDown(e))},badHtmlEncode:function(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/</g,"&lt;").replace(/ /g,"&nbsp;").replace(/\n/g,"")},updatePrompt:function(e){e=e||{};var t=$("#commandTextField").val(),n=this.badHtmlEncode(t);this.commandParagraph.innerHTML=n,this.cursorUpdate(t.length,e.selectionStart,e.selectionEnd),l.getEvents().trigger("commandScrollDown")},cursorUpdate:function(t,n,r){if(n===undefined||r===undefined)n=Math.max(t-1,0),r=t;var i=e("../util/zoomLevel").detectZoom(),s=10*i,o=22*i,u=$(this.commandParagraph).width(),a=u/s,f=Math.min(Math.max(1,r-n),a),l=String(f*s)+"px",c=String(s*(n%a))+"px",h=String(Math.floor(n/a)*o)+"px";$(this.commandCursor).css({width:l,left:c,top:h})},commandSelectChange:function(e){this.index+=e;if(this.index>=this.commands.length||this.index<0){this.clear(),this.index=-1;return}var t=this.commands.toArray()[this.index].get("text");this.setTextField(t)},clearLocalStorage:function(){this.commands.each(function(e){a.sync("delete",e,function(){})},this)},setTextField:function(e){this.$("#commandTextField").val(e)},clear:function(){this.setTextField("")},submit:function(){var e=this.$("#commandTextField").val().replace("\n","");this.clear(),this.submitCommand(e),this.index=-1},rollupCommands:function(e){var t=this.commands.toArray().slice(1,Number(e)+1);t.reverse();var n="";u.each(t,function(e){n+=e.get("text")+";"},this);var r=new h({text:n});this.commands.unshift(r),a.sync("create",r,function(){})},addToCommandHistory:function(e){var t=e.length&&this.index===-1||e.length&&this.index!==-1&&this.commands.toArray()[this.index].get("text")!==e;if(!t)return;var n=new h({text:e});this.commands.unshift(n),a.sync("create",n,function(){}),this.commands.length>100&&this.clearLocalStorage()},submitCommand:function(e){l.getEventBaton().trigger("commandSubmitted",e)}}),y=a.View.extend({tagName:"div",model:c,template:u.template($("#command-template").html()),events:{click:"clicked"},clicked:function(e){},initialize:function(){this.model.bind("change",this.wasChanged,this),this.model.bind("destroy",this.remove,this)},wasChanged:function(e,t){var n=t.changes,r=u.keys(n);u.difference(r,["status"]).length===0?this.updateStatus():this.render()},updateStatus:function(){var e=["inqueue","processing","finished"],t={};u.each(e,function(e){t[e]=!1}),t[this.model.get("status")]=!0;var n=this.$("p.commandLine");u.each(t,function(e,t){n.toggleClass(t,e)})},render:function(){var e=u.extend({resultType:"",result:"",formattedWarnings:this.model.getFormattedWarnings()},this.model.toJSON());return this.$el.html(this.template(e)),this},remove:function(){$(this.el).hide()}}),b=a.View.extend({initialize:function(e){this.collection=e.collection,this.collection.on("add",this.addOne,this),this.collection.on("reset",this.addAll,this),this.collection.on("all",this.render,this),this.collection.on("change",this.scrollDown,this),l.getEvents().on("commandScrollDown",this.scrollDown,this),l.getEvents().on("clearOldCommands",this.clearOldCommands,this)},addWarning:function(e){var t=new d({msg:e}),n=new c({error:t,rawStr:"Warning:"});this.collection.add(n)},clearOldCommands:function(){var e=[];this.collection.each(function(t){t.get("status")!=="inqueue"&&t.get("status")!=="processing"&&e.push(t)},this),u.each(e,function(e){e.destroy()},this),this.scrollDown()},scrollDown:function(){var e=$("#commandDisplay")[0],t=$("#terminal")[0],n=e.clientHeight>t.clientHeight||$(window).height()<e.clientHeight;$(t).toggleClass("scrolling",n),n&&(t.scrollTop=t.scrollHeight)},addOne:function(e){var t=new y({model:e});this.$("#commandDisplay").append(t.render().el),this.scrollDown()},addAll:function(){this.collection.each(this.addOne)}});n.CommandPromptView=g,n.CommandLineHistoryView=b}),e("/src/js/views/commandViews.js"),e.define("/src/js/views/gitDemonstrationView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../util/keyboard").KeyboardListener,h=e("../models/commandModel").Command,p=e("../views").ModalTerminal,d=e("../views").ContainedBase,v=e("../visuals/visualization").Visualization,m=d.extend({tagName:"div",className:"gitDemonstrationView box horizontal",template:u.template($("#git-demonstration-view").html()),events:{"click div.command > p.uiButton":"positive"},initialize:function(t){t=t||{},this.options=t,this.JSON=u.extend({beforeMarkdowns:["## Git Commits","","Awesome!"],command:"git commit",afterMarkdowns:["Now you have seen it in action","","Go ahead and try the level!"]},t);var n=function(t){return e("markdown").markdown.toHTML(t.join("\n"))};this.JSON.beforeHTML=n(this.JSON.beforeMarkdowns),this.JSON.afterHTML=n(this.JSON.afterMarkdowns),this.container=new p({title:t.title||"Git Demonstration"}),this.render(),this.checkScroll(),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new c({events:this.navEvents,aliasMap:{enter:"positive",right:"positive",left:"negative"},wait:!0}),this.visFinished=!1,this.initVis(),t.wait||this.show()},receiveMetaNav:function(e,t){var n=this;e.navEvents.on("positive",this.positive,this),this.metaContainerView=t},checkScroll:function(){var e=this.$("div.demonstrationText").children(),t=u.map(e,function(e){return e.clientHeight}),n=u.reduce(t,function(e,t){return e+t});n<this.$("div.demonstrationText").height()&&this.$("div.demonstrationText").addClass("noLongText")},dispatchBeforeCommand:function(){if(!this.options.beforeCommand)return;l.splitTextCommand(this.options.beforeCommand,function(e){this.mainVis.gitEngine.dispatch(new h({rawStr:e}),a.defer())},this),this.mainVis.gitVisuals.refreshTreeHarsh()},takeControl:function(){this.hasControl=!0,this.keyboardListener.listen(),this.metaContainerView&&this.metaContainerView.lock()},releaseControl:function(){if(!this.hasControl)return;this.hasControl=!1,this.keyboardListener.mute(),this.metaContainerView&&this.metaContainerView.unlock()},reset:function(){this.mainVis.reset(),this.dispatchBeforeCommand(),this.demonstrated=!1,this.$el.toggleClass("demonstrated",!1),this.$el.toggleClass("demonstrating",!1)},positive:function(){if(this.demonstrated||!this.hasControl)return;this.demonstrated=!0,this.demonstrate()},demonstrate:function(){this.$el.toggleClass("demonstrating",!0);var e=a.defer();this.dispatchCommand(this.JSON.command,e),e.promise.then(u.bind(function(){this.$el.toggleClass("demonstrating",!1),this.$el.toggleClass("demonstrated",!0),this.releaseControl()},this))},negative:function(e){if(this.$el.hasClass("demonstrating"))return;this.keyboardListener.passEventBack(e)},dispatchCommand:function(e,t){var n=[];l.splitTextCommand(e,function(e){n.push(new h({rawStr:e}))},this);var r=a.defer(),i=r.promise;u.each(n,function(e,t){i=i.then(u.bind(function(){var t=a.defer();return this.mainVis.gitEngine.dispatch(e,t),t.promise},this)),i=i.then(function(){return a.delay(300)})},this),i=i.then(function(){t.resolve()}),r.resolve()},tearDown:function(){this.mainVis.tearDown(),m.__super__.tearDown.apply(this)},hide:function(){this.releaseControl(),this.reset(),this.visFinished&&(this.mainVis.setTreeIndex(-1),this.mainVis.setTreeOpacity(0)),this.shown=!1,m.__super__.hide.apply(this)},show:function(){this.takeControl(),this.visFinished&&setTimeout(u.bind(function(){this.shown&&(this.mainVis.setTreeIndex(300),this.mainVis.showHarsh())},this),this.getAnimationTime()*1),this.shown=!0,m.__super__.show.apply(this)},die:function(){if(!this.visFinished)return;m.__super__.die.apply(this)},initVis:function(){this.mainVis=new v({el:this.$("div.visHolder div.visHolderInside")[0],noKeyboardInput:!0,noClick:!0,smallCanvas:!0,zIndex:-1}),this.mainVis.customEvents.on("paperReady",u.bind(function(){this.visFinished=!0,this.dispatchBeforeCommand(),this.shown&&this.show()},this))}});n.GitDemonstrationView=m}),e("/src/js/views/gitDemonstrationView.js"),e.define("/src/js/views/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../app"),c=e("../intl"),h=e("../util/constants"),p=e("../util/keyboard").KeyboardListener,d=e("../util/errors").GitError,v=f.View.extend({getDestination:function(){return this.destination||this.container.getInsideElement()},tearDown:function(){this.$el.remove(),this.container&&this.container.tearDown()},renderAgain:function(e){e=e||this.template(this.JSON),this.$el.html(e)},render:function(e){this.renderAgain(e);var t=this.getDestination();$(t).append(this.el)}}),m=v.extend({resolve:function(){this.deferred.resolve()},reject:function(){this.deferred.reject()}}),g=v.extend({positive:function(){this.navEvents.trigger("positive")},negative:function(){this.navEvents.trigger("negative")}}),y=v.extend({getAnimationTime:function(){return 700},show:function(){this.container.show()},hide:function(){this.container.hide()},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime()*1.1)}}),b=y.extend({tagName:"a",className:"generalButton uiButton",template:u.template($("#general-button").html()),events:{click:"click"},initialize:function(e){e=e||{},this.navEvents=e.navEvents||u.clone(f.Events),this.destination=e.destination,this.destination||(this.container=new x),this.JSON={buttonText:e.buttonText||"General Button",wantsWrapper:e.wantsWrapper!==undefined?e.wantsWrapper:!0},this.render(),this.container&&!e.wait&&this.show()},click:function(){this.clickFunc||(this.clickFunc=u.throttle(u.bind(this.sendClick,this),500)),this.clickFunc()},sendClick:function(){this.navEvents.trigger("click")}}),w=m.extend({tagName:"div",className:"confirmCancelView box horizontal justify",template:u.template($("#confirm-cancel-template").html()),events:{"click .confirmButton":"resolve","click .cancelButton":"reject"},initialize:function(e){if(!e.destination)throw new Error("needmore");this.destination=e.destination,this.deferred=e.deferred||a.defer(),this.JSON={confirm:e.confirm||"Confirm",cancel:e.cancel||"Cancel"},this.render()}}),E=g.extend({tagName:"div",className:"leftRightView box horizontal center",template:u.template($("#left-right-template").html()),events:{"click .left":"negative","click .right":"positive"},positive:function(){this.pipeEvents.trigger("positive"),E.__super__.positive.apply(this)},negative:function(){this.pipeEvents.trigger("negative"),E.__super__.negative.apply(this)},initialize:function(e){if(!e.destination||!e.events)throw new Error("needmore");this.destination=e.destination,this.pipeEvents=e.events,this.navEvents=u.clone(f.Events),this.JSON={showLeft:e.showLeft===undefined?!0:e.showLeft,lastNav:e.lastNav===undefined?!1:e.lastNav},this.render()}}),S=f.View.extend({tagName:"div",className:"modalView box horizontal center transitionOpacityLinear",template:u.template($("#modal-view-template").html()),getAnimationTime:function(){return 700},initialize:function(e){this.shown=!1,this.render()},render:function(){this.$el.html(this.template({})),$("body").append(this.el)},stealKeyboard:function(){l.getEventBaton().stealBaton("keydown",this.onKeyDown,this),l.getEventBaton().stealBaton("keyup",this.onKeyUp,this),l.getEventBaton().stealBaton("windowFocus",this.onWindowFocus,this),l.getEventBaton().stealBaton("documentClick",this.onDocumentClick,this),$("#commandTextField").blur()},releaseKeyboard:function(){l.getEventBaton().releaseBaton("keydown",this.onKeyDown,this),l.getEventBaton().releaseBaton("keyup",this.onKeyUp,this),l.getEventBaton().releaseBaton("windowFocus",this.onWindowFocus,this),l.getEventBaton().releaseBaton("documentClick",this.onDocumentClick,this),l.getEventBaton().trigger("windowFocus")},onWindowFocus:function(e){},onDocumentClick:function(e){},onKeyDown:function(e){e.preventDefault()},onKeyUp:function(e){e.preventDefault()},show:function(){this.toggleZ(!0),s.nextTick(u.bind(function(){this.toggleShow(!0)},this))},hide:function(){this.toggleShow(!1),setTimeout(u.bind(function(){this.shown||this.toggleZ(!1)},this),this.getAnimationTime())},getInsideElement:function(){return this.$(".contentHolder")},toggleShow:function(e){if(this.shown===e)return;e?this.stealKeyboard():this.releaseKeyboard(),this.shown=e,this.$el.toggleClass("show",e)},toggleZ:function(e){this.$el.toggleClass("inFront",e)},tearDown:function(){this.$el.html(""),$("body")[0].removeChild(this.el)}}),x=y.extend({tagName:"div",className:"modalTerminal box flex1",template:u.template($("#terminal-window-template").html()),events:{"click div.inside":"onClick"},initialize:function(e){e=e||{},this.navEvents=e.events||u.clone(f.Events),this.container=new S,this.JSON={title:e.title||"Heed This Warning!"},this.render()},onClick:function(){this.navEvents.trigger("click")},getInsideElement:function(){return this.$(".inside")}}),T=y.extend({tagName:"div",template:u.template($("#modal-alert-template").html()),initialize:function(e){e=e||{},this.JSON={title:e.title||"Something to say",text:e.text||"Here is a paragraph",markdown:e.markdown},e.markdowns&&(this.JSON.markdown=e.markdowns.join("\n")),this.container=new x({title:"Alert!"}),this.render(),e.wait||this.show()},render:function(){var t=this.JSON.markdown?e("markdown").markdown.toHTML(this.JSON.markdown):this.template(this.JSON);T.__super__.render.apply(this,[t])}}),N=f.View.extend({initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.modalAlert=new T(u.extend({},{markdown:"#you sure?"},e));var t=a.defer();this.buttonDefer=t,this.confirmCancel=new w({deferred:t,destination:this.modalAlert.getDestination()}),t.promise.then(this.deferred.resolve).fail(this.deferred.reject).done(u.bind(function(){this.close()},this)),this.navEvents=u.clone(f.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.keyboardListener=new p({events:this.navEvents,aliasMap:{enter:"positive",esc:"negative"}}),e.wait||this.modalAlert.show()},positive:function(){this.buttonDefer.resolve()},negative:function(){this.buttonDefer.reject()},getAnimationTime:function(){return 700},show:function(){this.modalAlert.show()},hide:function(){this.modalAlert.hide()},getPromise:function(){return this.deferred.promise},close:function(){this.keyboardListener.mute(),this.modalAlert.die()}}),C=N.extend({initialize:function(t){t=t||{};var n=t.nextLevel?c.getName(t.nextLevel):"",r=c.getDialog(e("../dialogs/nextLevel"))[0].options.markdowns,i=r.join("\n");i=c.template(i,{numCommands:t.numCommands,best:t.best}),t.numCommands<=t.best?i=i+"\n\n"+c.str("finish-dialog-win"):i=i+"\n\n"+c.str("finish-dialog-lose",{best:t.best}),i+="\n\n",t.nextLevel?i+=c.str("finish-dialog-next",{nextLevel:n}):i+=c.str("finish-dialog-finished"),t=u.extend({},t,{markdown:i}),C.__super__.initialize.apply(this,[t])}}),k=f.View.extend({initialize:function(e){this.grabBatons(),this.modalAlert=new T({markdowns:this.markdowns}),this.modalAlert.show()},grabBatons:function(){l.getEventBaton().stealBaton(this.eventBatonName,this.batonFired,this)},releaseBatons:function(){l.getEventBaton().releaseBaton(this.eventBatonName,this.batonFired,this)},finish:function(){this.releaseBatons(),this.modalAlert.die()}}),L=k.extend({initialize:function(e){this.eventBatonName="windowSizeCheck",this.markdowns=["## That window size is not supported :-/","Please resize your window back to a supported size","","(and of course, pull requests to fix this are appreciated :D)"],L.__super__.initialize.apply(this,[e])},batonFired:function(e){e.w>h.VIEWPORT.minWidth&&e.h>h.VIEWPORT.minHeight&&this.finish()}}),A=k.extend({initialize:function(e){if(!e||!e.level)throw new Error("need level");this.eventBatonName="zoomChange",this.markdowns=["## That zoom level of "+e.level+" is not supported :-/","Please zoom back to a supported zoom level with Ctrl + and Ctrl -","","(and of course, pull requests to fix this are appreciated :D)"],A.__super__.initialize.apply(this,[e])},batonFired:function(e){e<=h.VIEWPORT.maxZoom&&e>=h.VIEWPORT.minZoom&&this.finish()}}),O=v.extend({tagName:"div",className:"levelToolbarHolder",template:u.template($("#level-toolbar-template").html()),initialize:function(e){e=e||{},this.JSON={name:e.name||"Some level! (unknown name)"},this.beforeDestination=$($("#commandLineHistory div.toolbar")[0]),this.render(),e.wait||s.nextTick(u.bind(this.show,this))},getAnimationTime:function(){return 700},render:function(){var e=this.template(this.JSON);this.$el.html(e),this.beforeDestination.after(this.el)},die:function(){this.hide(),setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime())},hide:function(){this.$("div.toolbar").toggleClass("hidden",!0)},show:function(){this.$("div.toolbar").toggleClass("hidden",!1)}}),M=v.extend({tagName:"div",className:"helperBar transitionAll",template:u.template($("#helper-bar-template").html()),events:{"click a":"onClick"},onClick:function(e){var t=e.target,n=$(t).attr("data-id"),r="on"+n[0].toUpperCase()+n.slice(1)+"Click";this[r].call(this)},show:function(){this.$el.toggleClass("show",!0)},hide:function(){this.$el.toggleClass("show",!1),this.deferred&&this.deferred.resolve()},getItems:function(){return[]},setupChildren:function(){},fireCommand:function(e){l.getEventBaton().trigger("commandSubmitted",e)},showDeferMe:function(e){this.hide();var t=a.defer();e.deferred=t,t.promise.then(u.bind(function(){this.show()},this)),e.show()},onExitClick:function(){this.hide()},initialize:function(e){e=e||{},this.destination=$("body"),this.JSON={items:this.getItems()},this.render(),this.setupChildren(),e.wait||this.show()}}),_=M.extend({getItems:function(){return[{text:"Git Branching",id:"english"},{text:"Git ",id:"korean"},{text:"Git",id:"chinese"},{text:"Français(e)",id:"french"},{icon:"signout",id:"exit"}]},onEnglishClick:function(){this.fireCommand("locale en_US; levels"),this.hide()},onKoreanClick:function(){this.fireCommand("locale ko; levels"),this.hide()},onFrenchClick:function(){this.fireCommand("locale fr_FR; levels"),this.hide()},onChineseClick:function(){this.fireCommand("locale zh_CN; levels"),this.hide()}}),D=M.extend({getItems:function(){return[{text:"Levels",id:"levels"},{text:"Reset",id:"reset"},{text:"Undo",id:"undo"},{text:"Help",id:"help"},{icon:"signout",id:"exit"}]},onLevelsClick:function(){this.fireCommand("levels")},onResetClick:function(){this.fireCommand("reset")},onUndoClick:function(){this.fireCommand("undo")},onHelpClick:function(){this.fireCommand("help general; git help")}}),P=M.extend({getItems:function(){return[{text:"?",id:"commands"},{icon:"globe",id:"intl"}]},onIntlClick:function(){this.showDeferMe(this.intlHelper)},onCommandsClick:function(){this.showDeferMe(this.commandsHelper)},setupChildren:function(){this.commandsHelper=new D({wait:!0}),this.intlHelper=new _({wait:!0})}}),H=v.extend({tagName:"div",className:"canvasTerminalHolder box flex1",template:u.template($("#terminal-window-bare-template").html()),events:{"click div.wrapper":"onClick"},initialize:function(e){e=e||{},this.destination=$("body"),this.JSON={title:e.title||c.str("goal-to-reach"),text:e.text||c.str("hide-goal")},this.render(),this.inDom=!0,e.additionalClass&&this.$el.addClass(e.additionalClass)},getAnimationTime:function(){return 700},onClick:function(){this.die()},die:function(){this.slideOut(),this.inDom=!1,setTimeout(u.bind(function(){this.tearDown()},this),this.getAnimationTime())},slideOut:function(){this.slideToggle(!0)},slideIn:function(){this.slideToggle(!1)},slideToggle:function(e){this.$("div.terminal-window-holder").toggleClass("slideOut",e)},getCanvasLocation:function(){return this.$("div.inside")[0]}});n.BaseView=v,n.GeneralButton=b,n.ModalView=S,n.ModalTerminal=x,n.ModalAlert=T,n.ContainedBase=y,n.ConfirmCancelView=w,n.LeftRightView=E,n.ZoomAlertWindow=A,n.ConfirmCancelTerminal=N,n.WindowSizeAlertWindow=L,n.MainHelperBar=P,n.CanvasTerminalHolder=H,n.LevelToolbar=O,n.NextLevelConfirm=C}),e("/src/js/views/index.js"),e.define("/src/js/views/levelDropdownView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../util"),c=e("../intl"),h=e("../util/keyboard").KeyboardListener,p=e("../app"),d=e("../views").ModalTerminal,v=e("../views").ContainedBase,m=e("../views").BaseView,g=v.extend({tagName:"div",className:"levelDropdownView box vertical",template:u.template($("#level-dropdown-view").html()),initialize:function(e){e=e||{},this.JSON={},this.navEvents=u.clone(f.Events),this.navEvents.on("clickedID",u.debounce(u.bind(this.loadLevelID,this),300,!0)),this.navEvents.on("negative",this.negative,this),this.navEvents.on("positive",this.positive,this),this.navEvents.on("left",this.left,this),this.navEvents.on("right",this.right,this),this.navEvents.on("up",this.up,this),this.navEvents.on("down",this.down,this),this.keyboardListener=new h({events:this.navEvents,aliasMap:{esc:"negative",enter:"positive"},wait:!0}),this.sequences=p.getLevelArbiter().getSequences(),this.sequenceToLevels=p.getLevelArbiter().getSequenceToLevels(),this.container=new d({title:c.str("select-a-level")}),this.render(),p.getEvents().on("resetMapSolved",this.render,this),p.getEvents().on("localeChanged",this.render,this),e.wait||this.show()},render:function(){g.__super__.render.apply(this,arguments),this.buildSequences()},positive:function(){if(!this.selectedID)return;this.loadLevelID(this.selectedID)},left:function(){if(this.turnOnKeyboardSelection())return;this.leftOrRight(-1)},leftOrRight:function(e){this.deselectIconByID(this.selectedID),this.selectedIndex=this.wrapIndex(this.selectedIndex+e,this.getCurrentSequence()),this.selectedID=this.getSelectedID(),this.selectIconByID(this.selectedID)},right:function(){if(this.turnOnKeyboardSelection())return;this.leftOrRight(1)},up:function(){if(this.turnOnKeyboardSelection())return;this.selectedSequence=this.getPreviousSequence(),this.downOrUp()},down:function(){if(this.turnOnKeyboardSelection())return;this.selectedSequence=this.getNextSequence(),this.downOrUp()},downOrUp:function(){this.selectedIndex=this.boundIndex(this.selectedIndex,this.getCurrentSequence()),this.deselectIconByID(this.selectedID),this.selectedID=this.getSelectedID(),this.selectIconByID(this.selectedID)},turnOnKeyboardSelection:function(){return this.selectedID?!1:(this.selectFirst(),!0)},turnOffKeyboardSelection:function(){if(!this.selectedID)return;this.deselectIconByID(this.selectedID),this.selectedID=undefined,this.selectedIndex=undefined,this.selectedSequence=undefined},wrapIndex:function(e,t){return e=e>=t.length?0:e,e=e<0?t.length-1:e,e},boundIndex:function(e,t){return e=e>=t.length?t.length-1:e,e=e<0?0:e,e},getNextSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e+1,this.sequences);return this.sequences[t]},getPreviousSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e-1,this.sequences);return this.sequences[t]},getSequenceIndex:function(e){var t=this.sequences.indexOf(e);if(t<0)throw new Error("didnt find");return t},getIndexForID:function(e){return p.getLevelArbiter().getLevel(e).index},selectFirst:function(){var e=this.sequenceToLevels[this.sequences[0]][0].id;this.selectIconByID(e),this.selectedIndex=0,this.selectedSequence=this.sequences[0]},getCurrentSequence:function(){return this.sequenceToLevels[this.selectedSequence]},getSelectedID:function(){return this.sequenceToLevels[this.selectedSequence][this.selectedIndex].id},selectIconByID:function(e){this.toggleIconSelect(e,!0)},deselectIconByID:function(e){this.toggleIconSelect(e,!1)},toggleIconSelect:function(e,t){this.selectedID=e;var n="#levelIcon-"+e;$(n).toggleClass("selected",t)},negative:function(){this.hide()},testOption:function(e){return this.currentCommand&&(new RegExp("--"+e)).test(this.currentCommand.get("rawStr"))},show:function(e,t){this.currentCommand=t,this.updateSolvedStatus(),this.showDeferred=e,this.keyboardListener.listen(),g.__super__.show.apply(this)},hide:function(){this.showDeferred&&this.showDeferred.resolve(),this.showDeferred=undefined,this.keyboardListener.mute(),this.turnOffKeyboardSelection(),g.__super__.hide.apply(this)},loadLevelID:function(e){this.testOption("noOutput")||p.getEventBaton().trigger("commandSubmitted","level "+e),this.hide()},updateSolvedStatus:function(){u.each(this.seriesViews,function(e){e.updateSolvedStatus()},this)},buildSequences:function(){this.seriesViews=[],u.each(this.sequences,function(e){this.seriesViews.push(new y({destination:this.$el,name:e,navEvents:this.navEvents}))},this)}}),y=m.extend({tagName:"div",className:"seriesView box flex1 vertical",template:u.template($("#series-view").html()),events:{"click div.levelIcon":"click","mouseenter div.levelIcon":"enterIcon","mouseleave div.levelIcon":"leaveIcon"},initialize:function(e){this.name=e.name||"intro",this.navEvents=e.navEvents,this.info=p.getLevelArbiter().getSequenceInfo(this.name),this.levels=p.getLevelArbiter().getLevelsInSequence(this.name),this.levelIDs=[],u.each(this.levels,function(e){this.levelIDs.push(e.id)},this),this.destination=e.destination,this.JSON={displayName:c.getIntlKey(this.info,"displayName"),about:c.getIntlKey(this.info,"about"),ids:this.levelIDs},this.render(),this.updateSolvedStatus()},updateSolvedStatus:function(){var e=this.$("div.levelIcon").each(function(e,t){var n=$(t).attr("data-id");$(t).toggleClass("solved",p.getLevelArbiter().isLevelSolved(n))})},getEventID:function(e){var t=e.target;return $(t).attr("data-id")},resetAbout:function(){this.$("p.about").text(c.getIntlKey(this.info,"about")).css("font-style","inherit")},setAbout:function(e){this.$("p.about").text(e).css("font-style","italic")},enterIcon:function(e){var t=this.getEventID(e),n=p.getLevelArbiter().getLevel(t);this.setAbout(c.getName(n))},leaveIcon:function(){this.resetAbout()},click:function(e){var t=this.getEventID(e);this.navEvents.trigger("clickedID",t)}});n.LevelDropdownView=g}),e("/src/js/views/levelDropdownView.js"),e.define("/src/js/views/multiView.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("q"),f=e("../util").isBrowser()?window.Backbone:e("backbone"),l=e("../views").ModalTerminal,c=e("../views").ContainedBase,h=e("../views").ConfirmCancelView,p=e("../views").LeftRightView,d=e("../views").ModalAlert,v=e("../views/gitDemonstrationView").GitDemonstrationView,m=e("../views/builderViews"),g=m.MarkdownPresenter,y=e("../util/keyboard").KeyboardListener,b=e("../util/errors").GitError,w=f.View.extend({tagName:"div",className:"multiView",navEventDebounce:550,deathTime:700,typeToConstructor:{ModalAlert:d,GitDemonstrationView:v,MarkdownPresenter:g},initialize:function(e){e=e||{},this.childViewJSONs=e.childViews||[{type:"ModalAlert",options:{markdown:"Woah wtf!!"}},{type:"GitDemonstrationView",options:{command:"git checkout -b side; git commit; git commit"}},{type:"ModalAlert",options:{markdown:"Im second"}}],this.deferred=e.deferred||a.defer(),this.childViews=[],this.currentIndex=0,this.navEvents=u.clone(f.Events),this.navEvents.on("negative",this.getNegFunc(),this),this.navEvents.on("positive",this.getPosFunc(),this),this.navEvents.on("quit",this.finish,this),this.keyboardListener=new y({events:this.navEvents,aliasMap:{left:"negative",right:"positive",enter:"positive",esc:"quit"}}),this.render(),e.wait||this.start()},onWindowFocus:function(){},getAnimationTime:function(){return 700},getPromise:function(){return this.deferred.promise},getPosFunc:function(){return u.debounce(u.bind(function(){this.navForward()},this),this.navEventDebounce,!0)},getNegFunc:function(){return u.debounce(u.bind(function(){this.navBackward()},this),this.navEventDebounce,!0)},lock:function(){this.locked=!0},unlock:function(){this.locked=!1},navForward:function(){if(this.locked)return;if(this.currentIndex===this.childViews.length-1){this.hideViewIndex(this.currentIndex),this.finish();return}this.navIndexChange(1)},navBackward:function(){if(this.currentIndex===0)return;this.navIndexChange(-1)},navIndexChange:function(e){this.hideViewIndex(this.currentIndex),this.currentIndex+=e,this.showViewIndex(this.currentIndex)},hideViewIndex:function(e){this.childViews[e].hide()},showViewIndex:function(e){this.childViews[e].show()},finish:function(){this.keyboardListener.mute(),u.each(this.childViews,function(e){e.die()}),this.deferred.resolve()},start:function(){this.showViewIndex(this.currentIndex)},createChildView:function(e){var t=e.type;if(!this.typeToConstructor[t])throw new Error('no constructor for type "'+t+'"');var n=new this.typeToConstructor[t](u.extend({},e.options,{wait:!0}));return n},addNavToView:function(e,t){var n=new p({events:this.navEvents,destination:e.getDestination(),showLeft:t!==0,lastNav:t===this.childViewJSONs.length-1});e.receiveMetaNav&&e.receiveMetaNav(n,this)},render:function(){u.each(this.childViewJSONs,function(e,t){var n=this.createChildView(e);this.childViews.push(n),this.addNavToView(n,t)},this)}});n.MultiView=w}),e("/src/js/views/multiView.js"),e.define("/src/js/views/rebaseView.js",function(e,t,n,r,i,s,o){var u=e("../util/errors").GitError,a=e("underscore"),f=e("q"),l=e("../util").isBrowser()?window.Backbone:e("backbone"),c=e("../views").ModalTerminal,h=e("../views").ContainedBase,p=e("../views").ConfirmCancelView,d=e("../views").LeftRightView,v=h.extend({tagName:"div",template:a.template($("#interactive-rebase-template").html()),initialize:function(e){this.deferred=e.deferred,this.rebaseMap={},this.entryObjMap={},this.rebaseEntries=new g,e.toRebase.reverse(),a.each(e.toRebase,function(e){var t=e.get("id");this.rebaseMap[t]=e,this.entryObjMap[t]=new m({id:t}),this.rebaseEntries.add(this.entryObjMap[t])},this),this.container=new c({title:"Interactive Rebase"}),this.render(),this.show()},confirm:function(){this.die();var e=[];this.$("ul.rebaseEntries li").each(function(t,n){e.push(n.id)});var t=[];a.each(e,function(e){this.entryObjMap[e].get("pick")&&t.unshift(this.rebaseMap[e])},this),t.reverse(),this.deferred.resolve(t),this.$el.html("")},render:function(){var e={num:a.keys(this.rebaseMap).length},t=this.container.getInsideElement();this.$el.html(this.template(e)),$(t).append(this.el);var n=this.$("ul.rebaseEntries");this.rebaseEntries.each(function(e){new y({el:n,model:e})},this),n.sortable({axis:"y",placeholder:"rebaseEntry transitionOpacity ui-state-highlight",appendTo:"parent"}),this.makeButtons()},makeButtons:function(){var e=f.defer();e.promise.then(a.bind(function(){this.confirm()},this)).fail(a.bind(function(){this.hide(),this.deferred.resolve([])},this)).done(),new p({destination:this.$(".confirmCancel"),deferred:e})}}),m=l.Model.extend({defaults:{pick:!0},toggle:function(){this.set("pick",!this.get("pick"))}}),g=l.Collection.extend({model:m}),y=l.View.extend({tagName:"li",template:a.template($("#interactive-rebase-entry-template").html()),toggle:function(){this.model.toggle(),this.listEntry.toggleClass("notPicked",!this.model.get("pick"))},initialize:function(e){this.render()},render:function(){var e=this.model.toJSON();this.$el.append(this.template(this.model.toJSON())),this.listEntry=this.$el.children(":last"),this.listEntry.delegate("#toggleButton","click",a.bind(function(){this.toggle()},this))}});n.InteractiveRebaseView=v}),e("/src/js/views/rebaseView.js"),e.define("/src/js/visuals/animation/animationFactory.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("./index").Animation,l=e("../../util/constants").GRAPHICS,c=function(){};c.prototype.genCommitBirthAnimation=function(e,t,n){if(!e)throw new Error("Need animation queue to add closure to!");var r=l.defaultAnimationTime*1,i=r*2,s=t.get("visNode"),o=function(){n.refreshTree(r),s.setBirth(),s.parentInFront(),n.visBranchesFront(),s.animateUpdatedPosition(i,"bounce"),s.animateOutgoingEdges(r)};e.add(new f({closure:o,duration:Math.max(r,i)}))},c.prototype.overrideOpacityDepth2=function(e,t){t=t===undefined?1:t;var n={};return u.each(e,function(e,r){n[r]={},u.each(e,function(e,i){i=="opacity"?n[r][i]=t:n[r][i]=e})}),n},c.prototype.overrideOpacityDepth3=function(e,t){var n={};return u.each(e,function(e,r){n[r]=this.overrideOpacityDepth2(e,t)},this),n},c.prototype.genCommitBirthClosureFromSnapshot=function(e,t){var n=l.defaultAnimationTime*1,r=n*1.5,i=e.newCommit.get("visNode"),s=this.overrideOpacityDepth2(e.afterSnapshot[i.getID()]),o=this.overrideOpacityDepth3(e.afterSnapshot),u=function(){i.setBirthFromSnapshot(e.beforeSnapshot),i.parentInFront(),t.visBranchesFront(),i.animateToAttr(s,r,"bounce"),i.animateOutgoingEdgesToAttr(o,r)};return u},c.prototype.refreshTree=function(e,t){e.add(new f({closure:function(){t.refreshTree()}}))},c.prototype.rebaseAnimation=function(e,t,n,r){this.rebaseHighlightPart(e,t,n),this.rebaseBirthPart(e,t,n,r)},c.prototype.rebaseHighlightPart=function(e,t,n){var r=l.defaultAnimationTime*.66,i=r*2,s=t.toRebaseArray,o=t.destinationBranch.get("visBranch");o||(o=t.destinationBranch.get("visNode")),u.each(s,function(t){var n=t.get("visNode");e.add(new f({closure:function(){n.highlightTo(o,i,"easeInOut")},duration:r*1.5}))},this),this.delay(e,r*2)},c.prototype.rebaseBirthPart=function(e,t,n,r){var i=t.rebaseSteps,s=[];u.each(i,function(e){var t=e.newCommit.get("visNode");s.push(t),t.setOpacity(0),t.setOutgoingEdgesOpacity(0)},this);var o=[];u.each(i,function(t,n){var i=s.slice(n+1),u=this.genFromToSnapshotAnimation(t.beforeSnapshot,t.afterSnapshot,i,o,r),a=this.genCommitBirthClosureFromSnapshot(t,r),c=function(){u(),a()};e.add(new f({closure:c,duration:l.defaultAnimationTime*1.5})),o.push(t.newCommit.get("visNode"))},this),this.delay(e),this.refreshTree(e,r)},c.prototype.delay=function(e,t){t=t||l.defaultAnimationTime,e.add(new f({closure:function(){},duration:t}))},c.prototype.genSetAllCommitOpacities=function(e,t){var n=e.slice(0);return function(){u.each(n,function(e){e.setOpacity(t),e.setOutgoingEdgesOpacity(t)})}},c.prototype.stripObjectsFromSnapshot=function(e,t){var n=[];u.each(t,function(e){n.push(e.getID())});var r={};return u.each(e,function(e,t){if(u.include(n,t))return;r[t]=e},this),r},c.prototype.genFromToSnapshotAnimation=function(e,t,n,r,i){var s=[];u.each(n,function(e){s.push(e),s=s.concat(e.get("outgoingEdges"))});var o=function(e){if(!e)return;u.each(e,function(t,n){e[n].opacity=1})};return u.each([e,t],function(e){u.each(r,function(t){o(e[t.getID()]),u.each(t.get("outgoingEdges"),function(t){o(e[t.getID()])})})}),function(){i.animateAllFromAttrToAttr(e,t,s)}},n.AnimationFactory=c}),e("/src/js/visuals/animation/animationFactory.js"),e.define("/src/js/visuals/animation/index.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../../util/constants").GLOBAL,l=a.Model.extend({defaults:{duration:300,closure:null},validateAtInit:function(){if(!this.get("closure"))throw new Error("give me a closure!")},initialize:function(e){this.validateAtInit()},run:function(){this.get("closure")()}}),c=a.Model.extend({defaults:{animations:null,index:0,callback:null,defer:!1},initialize:function(e){this.set("animations",[]),e.callback||console.warn("no callback")},add:function(e){if(!e instanceof l)throw new Error("Need animation not something else");this.get("animations").push(e)},start:function(){this.set("index",0),f.isAnimating=!0,this.next()},finish:function(){f.isAnimating=!1,this.get("callback")()},next:function(){var e=this.get("animations"),t=this.get("index");if(t>=e.length){this.finish();return}var n=e[t],r=n.get("duration");n.run(),this.set("index",t+1),setTimeout(u.bind(function(){this.next()},this),r)}});n.Animation=l,n.AnimationQueue=c}),e("/src/js/visuals/animation/index.js"),e.define("/src/js/visuals/index.js",function(e,t,n,r,i,s,o){function w(t){t=t||{},this.options=t,this.commitCollection=t.commitCollection,this.branchCollection=t.branchCollection,this.visNodeMap={},this.visEdgeCollection=new b,this.visBranchCollection=new g,this.commitMap={},this.rootCommit=null,this.branchStackMap=null,this.upstreamBranchSet=null,this.upstreamHeadSet=null,this.paper=t.paper,this.gitReady=!1,this.branchCollection.on("add",this.addBranchFromEvent,this),this.branchCollection.on("remove",this.removeBranch,this),this.deferred=[],this.posBoundaries={min:0,max:1},this.flipFraction=.65;var n=e("../app");n.getEvents().on("refreshTree",this.refreshTree,this)}function E(e){var t=0,n=0,r=0,i=0,s=e.length;u.each(e,function(e){var s=e.split("(")[1];s=s.split(")")[0],s=s.split(","),r+=parseFloat(s[1]),i+=parseFloat(s[2]);var o=parseFloat(s[0]),u=o*Math.PI*2;t+=Math.cos(u),n+=Math.sin(u)}),t/=s,n/=s,r/=s,i/=s;var o=Math.atan2(n,t)/(Math.PI*2);return o<0&&(o+=1),"hsb("+String(o)+","+String(r)+","+String(i)+")"}var u=e("underscore"),a=e("q"),f=e("backbone"),l=e("../util/constants").GRAPHICS,c=e("../util/constants").GLOBAL,h=e("../models/collections"),p=h.CommitCollection,d=h.BranchCollection,v=e("../visuals/visNode").VisNode,m=e("../visuals/visBranch").VisBranch,g=e("../visuals/visBranch").VisBranchCollection,y=e("../visuals/visEdge").VisEdge,b=e("../visuals/visEdge").VisEdgeCollection;w.prototype.defer=function(e){this.deferred.push(e)},w.prototype.deferFlush=function(){u.each(this.deferred,function(e){e()},this),this.deferred=[]},w.prototype.resetAll=function(){var e=this.visEdgeCollection.toArray();u.each(e,function(e){e.remove()},this);var t=this.visBranchCollection.toArray();u.each(t,function(e){e.remove()},this),u.each(this.visNodeMap,function(e){e.remove()},this),this.visEdgeCollection.reset(),this.visBranchCollection.reset(),this.visNodeMap={},this.rootCommit=null,this.commitMap={}},w.prototype.tearDown=function(){this.resetAll(),this.paper.remove()},w.prototype.assignGitEngine=function(e){this.gitEngine=e,this.initHeadBranch(),this.deferFlush()},w.prototype.initHeadBranch=function(){this.addBranchFromEvent(this.gitEngine.HEAD)},w.prototype.getScreenPadding=function(){return{widthPadding:l.nodeRadius*1.5,topHeightPadding:l.nodeRadius*1.5,bottomHeightPadding:l.nodeRadius*5}},w.prototype.getFlipPos=function(){var e=this.posBoundaries.min,t=this.posBoundaries.max;return this.flipFraction*(t-e)+e},w.prototype.toScreenCoords=function(e){if(!this.paper.width)throw new Error("being called too early for screen coords");var t=this.getScreenPadding(),n=function(e,t,n){return n+e*(t-n*2)},r=function(e,t,n,r){return n+e*(t-r-n)};return{x:n(e.x,this.paper.width,t.widthPadding),y:r(e.y,this.paper.height,t.topHeightPadding,t.bottomHeightPadding)}},w.prototype.animateAllAttrKeys=function(e,t,n,r){var i=a.defer(),s=function(i){i.animateAttrKeys(e,t,n,r)};this.visBranchCollection.each(s),this.visEdgeCollection.each(s),u.each(this.visNodeMap,s);var o=n!==undefined?n:l.defaultAnimationTime;return setTimeout(function(){i.resolve()},o),i.promise},w.prototype.finishAnimation=function(){var e=this,t=a.defer(),n=a.defer(),r=l.defaultAnimationTime,i=l.nodeRadius,s="Solved!!\n:D",o=null,f=u.bind(function(){o=this.paper.text(this.paper.width/2,this.paper.height/2,s),o.attr({opacity:0,"font-weight":500,"font-size":"32pt","font-family":"Monaco, Courier, font-monospace",stroke:"#000","stroke-width":2,fill:"#000"}),o.animate({opacity:1},r)},this);return t.promise.then(u.bind(function(){return this.animateAllAttrKeys({exclude:["circle"]},{opacity:0},r*1.1)},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:i*2},r*1.5)},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:i*.75},r*.5)},this)).then(u.bind(function(){return f(),this.explodeNodes()},this)).then(u.bind(function(){return this.explodeNodes()},this)).then(u.bind(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{},r*1.25)},this)).then(u.bind(function(){return o.animate({opacity:0},r,undefined,undefined,function(){o.remove()}),this.animateAllAttrKeys({},{})},this)).then(function(){n.resolve()}).fail(function(e){console.warn("animation error"+e)}).done(),t.resolve(),n.promise},w.prototype.explodeNodes=function(){var e=a.defer(),t=[];u.each(this.visNodeMap,function(e){t.push(e.getExplodeStepFunc())});var n=setInterval(function(){var r=[];u.each(t,function(e){e()&&r.push(e)});if(!r.length){clearInterval(n),e.resolve();return}t=r},.025);return e.promise},w.prototype.animateAllFromAttrToAttr=function(e,t,n){var r=function(r){var i=r.getID();if(u.include(n,i))return;if(!e[i]||!t[i])return;r.animateFromAttrToAttr(e[i],t[i])};this.visBranchCollection.each(r),this.visEdgeCollection.each(r),u.each(this.visNodeMap,r)},w.prototype.genSnapshot=function(){this.fullCalc();var e={};return u.each(this.visNodeMap,function(t){e[t.get("id")]=t.getAttributes()},this),this.visBranchCollection.each(function(t){e[t.getID()]=t.getAttributes()},this),this.visEdgeCollection.each(function(t){e[t.getID()]=t.getAttributes()},this),e},w.prototype.refreshTree=function(e){if(!this.gitReady||!this.gitEngine.rootCommit)return;this.fullCalc(),this.animateAll(e)},w.prototype.refreshTreeHarsh=function(){this.fullCalc(),this.animateAll(0)},w.prototype.animateAll=function(e){this.zIndexReflow(),this.animateEdges(e),this.animateNodePositions(e),this.animateRefs(e)},w.prototype.fullCalc=function(){this.calcTreeCoords(),this.calcGraphicsCoords()},w.prototype.calcTreeCoords=function(){if(!this.rootCommit)throw new Error("grr, no root commit!");this.calcUpstreamSets(),this.calcBranchStacks(),this.calcDepth(),this.calcWidth()},w.prototype.calcGraphicsCoords=function(){this.visBranchCollection.each(function(e){e.updateName()})},w.prototype.calcUpstreamSets=function(){this.upstreamBranchSet=this.gitEngine.getUpstreamBranchSet(),this.upstreamHeadSet=this.gitEngine.getUpstreamHeadSet()},w.prototype.getCommitUpstreamBranches=function(e){return this.branchStackMap[e.get("id")]},w.prototype.getBlendedHuesForCommit=function(e){var t=this.upstreamBranchSet[e.get("id")];if(!t)throw new Error("that commit doesnt have upstream branches!");return this.blendHuesFromBranchStack(t)},w.prototype.blendHuesFromBranchStack=function(e){var t=[];return u.each(e,function(e){var n=e.obj.get("visBranch").get("fill");if(n.slice(0,3)!=="hsb"){var r=Raphael.color(n);n="hsb("+String(r.h)+","+String(r.l),n=n+","+String(r.s)+")"}t.push(n)}),E(t)},w.prototype.getCommitUpstreamStatus=function(e){if(!this.upstreamBranchSet)throw new Error("Can't calculate this yet!");var t=e.get("id"),n=this.upstreamBranchSet,r=this.upstreamHeadSet;return n[t]?"branch":r[t]?"head":"none"},w.prototype.calcBranchStacks=function(){var e=this.gitEngine.getBranches(),t={};u.each(e,function(e){var n=e.target.get("id");t[n]=t[n]||[],t[n].push(e),t[n].sort(function(e,t){var n=e.obj.get("id"),r=t.obj.get("id");return n=="master"||r=="master"?n=="master"?-1:1:n.localeCompare(r)})}),this.branchStackMap=t},w.prototype.calcWidth=function(){this.maxWidthRecursive(this.rootCommit),this.assignBoundsRecursive(this.rootCommit,this.posBoundaries.min,this.posBoundaries.max)},w.prototype.maxWidthRecursive=function(e){var t=0;u.each(e.get("children"),function(n){if(n.isMainParent(e)){var r=this.maxWidthRecursive(n);t+=r}},this);var n=Math.max(1,t);return e.get("visNode").set("maxWidth",n),n},w.prototype.assignBoundsRecursive=function(e,t,n,r){r=r===undefined?.5:r;var i=t+(n-t)*r;e.get("visNode").get("pos").x=i;if(e.get("children").length===0)return;var s=n-t,o=0,a=e.get("children");u.each(a,function(t){t.isMainParent(e)&&(o+=t.get("visNode").getMaxWidthScaled())},this);var f=function(e,t){return s<.99?a.length<2?t:.5:a.length<2?.5:e===0?1/3:e===a.length-1?2/3:t},l=t;u.each(a,function(t,n){if(!t.isMainParent(e))return;var i=t.get("visNode").getMaxWidthScaled(),u=i/o*s,a=f(n,r),c=l,h=c+u;this.assignBoundsRecursive(t,c,h,a),l=c+u},this)},w.prototype.calcDepth=function(){var e=this.calcDepthRecursive(this.rootCommit,0);e>15&&console.warn("graphics are degrading from too many layers");var t=this.getDepthIncrement(e);u.each(this.visNodeMap,function(e){e.setDepthBasedOn(t)},this)},w.prototype.animateNodePositions=function(e){u.each(this.visNodeMap,function(t){t.animateUpdatedPosition(e)},this)},w.prototype.addBranchFromEvent=function(e,t,n){var r=u.bind(function(){this.addBranch(e)},this);!this.gitEngine||!this.gitReady?this.defer(r):r()},w.prototype.addBranch=function(e){var t=new m({branch:e,gitVisuals:this,gitEngine:this.gitEngine});this.visBranchCollection.add(t),this.gitReady?t.genGraphics(this.paper):this.defer(u.bind(function(){t.genGraphics(this.paper)},this))},w.prototype.removeVisBranch=function(e){this.visBranchCollection.remove(e)},w.prototype.removeVisNode=function(e){this.visNodeMap[e.getID()]=undefined},w.prototype.removeVisEdge=function(e){this.visEdgeCollection.remove(e)},w.prototype.animateRefs=function(e){this.visBranchCollection.each(function(t){t.animateUpdatedPos(e)},this)},w.prototype.animateEdges=function(e){this.visEdgeCollection.each(function(t){t.animateUpdatedPath(e)},this)},w.prototype.getMinLayers=function(){return this.options.smallCanvas?4:7},w.prototype.getDepthIncrement=function(e){e=Math.max(e,this.getMinLayers());var t=1/e;return t},w.prototype.calcDepthRecursive=function(e,t){e.get("visNode").setDepth(t);var n=e.get("children"),r=t;return u.each(n,function(e){var n=this.calcDepthRecursive(e,t+1);r=Math.max(n,r)},this),r},w.prototype.canvasResize=function(e,t){this.resizeFunc||this.genResizeFunc(),this.resizeFunc(e,t)},w.prototype.genResizeFunc=function(){this.resizeFunc=u.debounce(u.bind(function(t,n){this.refreshTree()},this),200,!0)},w.prototype.addNode=function(e,t){this.commitMap[e]=t,t.get("rootCommit")&&(this.rootCommit=t);var n=new v({id:e,commit:t,gitVisuals:this,gitEngine:this.gitEngine});return this.visNodeMap[e]=n,this.gitReady&&n.genGraphics(this.paper),n},w.prototype.addEdge=function(e,t){var n=this.visNodeMap[e],r=this.visNodeMap[t];if(!n||!r)throw new Error("one of the ids in ("+e+", "+t+") does not exist");var i=new y({tail:n,head:r,gitVisuals:this,gitEngine:this.gitEngine});this.visEdgeCollection.add(i),this.gitReady&&i.genGraphics(this.paper)},w.prototype.zIndexReflow=function(){this.visNodesFront(),this.visBranchesFront()},w.prototype.visNodesFront=function(){u.each(this.visNodeMap,function(e){e.toFront()})},w.prototype.visBranchesFront=function(){this.visBranchCollection.each(function(e){e.nonTextToFront(),e.textToFront()}),this.visBranchCollection.each(function(e){e.textToFrontIfInStack()})},w.prototype.drawTreeFromReload=function(){this.gitReady=!0,this.deferFlush(),this.calcTreeCoords()},w.prototype.drawTreeFirstTime=function(){this.gitReady=!0,this.calcTreeCoords(),u.each(this.visNodeMap,function(e){e.genGraphics(this.paper)},this),this.visEdgeCollection.each(function(e){e.genGraphics(this.paper)},this),this.visBranchCollection.each(function(e){e.genGraphics(this.paper)},this),this.zIndexReflow()},n.GitVisuals=w}),e("/src/js/visuals/index.js"),e.define("/src/js/visuals/tree.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e("/src/js/visuals/tree.js"),e.define("/src/js/visuals/visBase.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=a.Model.extend({removeKeys:function(e){u.each(e,function(e){this.get(e)&&this.get(e).remove()},this)},animateAttrKeys:function(e,t,n,r){e=u.extend({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var i=this.getAttributes();u.each(e.include,function(e){i[e]=u.extend({},i[e],t)}),u.each(e.exclude,function(e){delete i[e]}),this.animateToAttr(i,n,r)}});n.VisBase=f}),e("/src/js/visuals/visBase.js"),e.define("/src/js/visuals/visBranch.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=function(){var e=Math.random(),t="hsb("+String(e)+",0.7,1)";return t},h=l.extend({defaults:{pos:null,text:null,rect:null,arrow:null,isHead:!1,flip:1,fill:f.rectFill,stroke:f.rectStroke,"stroke-width":f.rectStrokeWidth,offsetX:f.nodeRadius*4.75,offsetY:0,arrowHeight:14,arrowInnerSkew:0,arrowEdgeHeight:6,arrowLength:14,arrowOffsetFromCircleX:10,vPad:5,hPad:5,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){if(!this.get("branch"))throw new Error("need a branch!")},getID:function(){return this.get("branch").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine");if(!this.gitEngine)throw new Error("asd wtf");this.get("branch").set("visBranch",this);var e=this.get("branch").get("id");e=="HEAD"?(this.set("isHead",!0),this.set("flip",-1),this.set("fill",f.headRectFill)):e!=="master"&&this.set("fill",c())},getCommitPosition:function(){var e=this.gitEngine.getCommitFromRef(this.get("branch")),t=e.get("visNode");return this.set("flip",this.getFlipBool(e,t)),t.getScreenCoords()},getFlipBool:function(e,t){var n=this.get("gitVisuals").getFlipPos(),r=t.get("pos").x>n;return this.get("isHead")?r?this.isBranchStackEmpty()?-1:1:this.isBranchStackEmpty()?1:-1:r?-1:1},getBranchStackIndex:function(){if(this.get("isHead"))return 0;var e=this.getBranchStackArray(),t=-1;return u.each(e,function(e,n){e.obj==this.get("branch")&&(t=n)},this),t},getBranchStackLength:function(){return this.get("isHead")?1:this.getBranchStackArray().length},isBranchStackEmpty:function(){var e=this.gitVisuals.branchStackMap[this.getCommitID()];return e?e.length===0:!0},getCommitID:function(){var e=this.get("branch").get("target");return e.get("type")==="branch"&&(e=e.get("target")),e.get("id")},getBranchStackArray:function(){var e=this.gitVisuals.branchStackMap[this.getCommitID()];return e===undefined?(this.gitVisuals.calcBranchStacks(),this.getBranchStackArray()):e},getTextPosition:function(){var e=this.getCommitPosition(),t=this.getBranchStackIndex();return{x:e.x+this.get("flip")*this.get("offsetX"),y:e.y+t*f.multiBranchY+this.get("offsetY")}},getRectPosition:function(){var e=this.getTextPosition(),t=this.get("flip"),n=this.getTextSize();return{x:e.x-.5*n.w-this.get("hPad"),y:e.y-.5*n.h-this.get("vPad")}},getArrowPath:function(){var e=function(e,t,n){return{x:e.x+t,y:e.y+n}},t=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},n=this.get("flip"),r=e(this.getCommitPosition(),n*this.get("arrowOffsetFromCircleX"),0),i=e(r,n*this.get("arrowLength"),-this.get("arrowHeight")),s=e(r,n*this.get("arrowLength"),this.get("arrowHeight")),o=e(i,n*this.get("arrowInnerSkew"),this.get("arrowEdgeHeight")),a=e(s,n*this.get("arrowInnerSkew"),-this.get("arrowEdgeHeight")),f=49,l=e(o,n*f,0),c=e(a,n*f,0),h="";h+="M"+t(l)+" ";var p=[o,i,r,s,a,c];return u.each(p,function(e){h+="L"+t(e)+" "},this),h+="z",h},getTextSize:function(){var e=function(e){var t=e.get("text")?e.get("text").node:null;return t===null?0:t.clientWidth},t=function(e){return e.w||(e.w=75),e.h||(e.h=20),e},n=this.get("text").node;if(this.get("isHead"))return t({w:n.clientWidth,h:n.clientHeight});var r=0;return u.each(this.getBranchStackArray(),function(t){r=Math.max(r,e(t.obj.get("visBranch")))}),t({w:r,h:n.clientHeight})},getSingleRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad");return{w:e.w+t*2,h:e.h+n*2}},getRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),n=this.get("hPad"),r=this.getBranchStackLength();return{w:e.w+t*2,h:e.h*r*1.1+n*2}},getName:function(){var e=this.get("branch").get("id"),t=this.gitEngine.HEAD.get("target").get("id"),n=t==e?"*":"";return e+n},nonTextToFront:function(){this.get("arrow").toFront(),this.get("rect").toFront()},textToFront:function(){this.get("text").toFront()},textToFrontIfInStack:function(){this.getBranchStackIndex()!==0&&this.get("text").toFront()},getFill:function(){return this.get("isHead")||this.getBranchStackLength()==1||this.getBranchStackIndex()!==0?this.get("fill"):this.gitVisuals.blendHuesFromBranchStack(this.getBranchStackArray())},remove:function(){this.removeKeys(["text","arrow","rect"]),this.gitVisuals.removeVisBranch(this)},genGraphics:function(e){var t=this.getTextPosition(),n=this.getName(),r;r=e.text(t.x,t.y,String(n)),r.attr({"font-size":14,"font-family":"Monaco, Courier, font-monospace",opacity:this.getTextOpacity()}),this.set("text",r);var i=this.getRectPosition(),s=this.getRectSize(),o=e.rect(i.x,i.y,s.w,s.h,8).attr(this.getAttributes().rect);this.set("rect",o);var u=this.getArrowPath(),a=e.path(u).attr(this.getAttributes().arrow);this.set("arrow",a),this.attachClickHandlers(),o.toFront(),r.toFront()},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("branch").get("id"),n=e("../app"),r=[this.get("rect"),this.get("text"),this.get("arrow")];u.each(r,function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},updateName:function(){this.get("text").attr({text:this.getName()})},getNonTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:this.getBranchStackIndex()===0?1:0},getTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:1},getAttributes:function(){var e=this.getNonTextOpacity(),t=this.getTextOpacity();this.updateName();var n=this.getTextPosition(),r=this.getRectPosition(),i=this.getRectSize(),s=this.getArrowPath();return{text:{x:n.x,y:n.y,opacity:t},rect:{x:r.x,y:r.y,width:i.w,height:i.h,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")},arrow:{path:s,opacity:e,fill:this.getFill(),stroke:this.get("stroke"),"stroke-width":this.get("stroke-width")}}},animateUpdatedPos:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("text").attr(e.text),this.get("rect").attr(e.rect),this.get("arrow").attr(e.arrow);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("text").stop().animate(e.text,r,i),this.get("rect").stop().animate(e.rect,r,i),this.get("arrow").stop().animate(e.arrow,r,i)}}),p=a.Collection.extend({model:h});n.VisBranchCollection=p,n.VisBranch=h,n.randomHueString=c}),e("/src/js/visuals/visBranch.js"),e.define("/src/js/visuals/visEdge.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{tail:null,head:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing},validateAtInit:function(){var e=["tail","head"];u.each(e,function(e){if(!this.get(e))throw new Error(e+" is required!")},this)},getID:function(){return this.get("tail").get("id")+"."+this.get("head").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.get("tail").get("outgoingEdges").push(this)},remove:function(){this.removeKeys(["path"]),this.gitVisuals.removeVisEdge(this)},genSmoothBezierPathString:function(e,t){var n=e.getScreenCoords(),r=t.getScreenCoords();return this.genSmoothBezierPathStringFromCoords(n,r)},genSmoothBezierPathStringFromCoords:function(e,t){var n=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},r=function(e,t,n){return n=n||f.curveControlPointOffset,{x:e.x,y:e.y+n*t}},i=function(e,t,n){return{x:e.x+t,y:e.y+n}};e=r(e,-1,this.get("tail").getRadius()),t=r(t,1,this.get("head").getRadius());var s="";s+="M"+n(e)+" ",s+="C",s+=n(r(e,-1))+" ",s+=n(r(t,1))+" ",s+=n(t);var o=f.arrowHeadSize||10;return s+=" L"+n(i(t,-o,o)),s+=" L"+n(i(t,o,o)),s+=" L"+n(t),s+="C",s+=n(r(t,1))+" ",s+=n(r(e,-1))+" ",s+=n(e),s},getBezierCurve:function(){return this.genSmoothBezierPathString(this.get("tail"),this.get("head"))},getStrokeColor:function(){return f.visBranchStrokeColorNone},setOpacity:function(e){e=e===undefined?1:e,this.get("path").attr({opacity:e})},genGraphics:function(e){var t=this.getBezierCurve(),n=e.path(t).attr({"stroke-width":f.visBranchStrokeWidth,stroke:this.getStrokeColor(),"stroke-linecap":"round","stroke-linejoin":"round",fill:this.getStrokeColor()});n.toBack(),this.set("path",n)},getOpacity:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("tail")),t={branch:1,head:f.edgeUpstreamHeadOpacity,none:f.edgeUpstreamNoneOpacity};if(t[e]===undefined)throw new Error("bad stat");return t[e]},getAttributes:function(){var e=this.getBezierCurve(),t=this.getOpacity();return{path:{path:e,opacity:t}}},animateUpdatedPath:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToAttr:function(e,t,n){if(t===0){this.get("path").attr(e.path);return}this.get("path").toBack(),this.get("path").stop().animate(e.path,t!==undefined?t:this.get("animationSpeed"),n||this.get("animationEasing"))}}),h=a.Collection.extend({model:c});n.VisEdgeCollection=h,n.VisEdge=c}),e("/src/js/visuals/visEdge.js"),e.define("/src/js/visuals/visNode.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("backbone"),f=e("../util/constants").GRAPHICS,l=e("../visuals/visBase").VisBase,c=l.extend({defaults:{depth:undefined,maxWidth:null,outgoingEdges:null,circle:null,text:null,id:null,pos:null,radius:null,commit:null,animationSpeed:f.defaultAnimationTime,animationEasing:f.defaultEasing,fill:f.defaultNodeFill,"stroke-width":f.defaultNodeStrokeWidth,stroke:f.defaultNodeStroke},getID:function(){return this.get("id")},validateAtInit:function(){if(!this.get("id"))throw new Error("need id for mapping");if(!this.get("commit"))throw new Error("need commit for linking");this.get("pos")||this.set("pos",{x:Math.random(),y:Math.random()})},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.set("outgoingEdges",[])},setDepth:function(e){this.set("depth",Math.max(this.get("depth")||0,e))},setDepthBasedOn:function(e){if(this.get("depth")===undefined){debugger;throw new Error("no depth yet!")}var t=this.get("pos");t.y=this.get("depth")*e},getMaxWidthScaled:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit")),t={branch:1,head:.3,none:.1};if(t[e]===undefined)throw new Error("bad stat");return t[e]*this.get("maxWidth")},toFront:function(){this.get("circle").toFront(),this.get("text").toFront()},getOpacity:function(){var e={branch:1,head:f.upstreamHeadOpacity,none:f.upstreamNoneOpacity},t=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));if(e[t]===undefined)throw new Error("invalid status");return e[t]},getTextScreenCoords:function(){return this.getScreenCoords()},getAttributes:function(){var e=this.getScreenCoords(),t=this.getTextScreenCoords(),n=this.getOpacity();return{circle:{cx:e.x,cy:e.y,opacity:n,r:this.getRadius(),fill:this.getFill(),"stroke-width":this.get("stroke-width"),stroke:this.get("stroke")},text:{x:t.x,y:t.y,opacity:n}}},highlightTo:function(e,t,n){var r=e.get("fill"),i={circle:{fill:r,stroke:r,"stroke-width":this.get("stroke-width")*5},text:{}};this.animateToAttr(i,t,n)},animateUpdatedPosition:function(e,t){var n=this.getAttributes();this.animateToAttr(n,e,t)},animateFromAttrToAttr:function(e,t,n,r){this.animateToAttr(e,0),this.animateToAttr(t,n,r)},animateToSnapshot:function(e,t,n){if(!e[this.getID()])return;this.animateToAttr(e[this.getID()],t,n)},animateToAttr:function(e,t,n){if(t===0){this.get("circle").attr(e.circle),this.get("text").attr(e.text);return}var r=t!==undefined?t:this.get("animationSpeed"),i=n||this.get("animationEasing");this.get("circle").stop().animate(e.circle,r,i),this.get("text").stop().animate(e.text,r,i),n=="bounce"&&e.circle&&e.circle.cx!==undefined&&e.text&&e.text.x!==undefined&&(this.get("circle").animate(e.circle.cx,r,"easeInOut"),this.get("text").animate(e.text.x,r,"easeInOut"))},getScreenCoords:function(){var e=this.get("pos");return this.gitVisuals.toScreenCoords(e)},getRadius:function(){return this.get("radius")||f.nodeRadius},getParentScreenCoords:function(){return this.get("commit").get("parents")[0].get("visNode").getScreenCoords()},setBirthPosition:function(){var e=this.getParentScreenCoords();this.get("circle").attr({cx:e.x,cy:e.y,opacity:0,r:0}),this.get("text").attr({x:e.x,y:e.y,opacity:0})},setBirthFromSnapshot:function(e){var t=this.get("commit").get("parents")[0].get("visNode").getID(),n=e[t];this.get("circle").attr({opacity:0,r:0,cx:n.circle.cx,cy:n.circle.cy}),this.get("text").attr({opacity:0,x:n.text.x,y:n.text.y});var r={x:n.circle.cx,y:n.circle.cy};this.setOutgoingEdgesBirthPosition(r)},setBirth:function(){this.setBirthPosition(),this.setOutgoingEdgesBirthPosition(this.getParentScreenCoords())},setOutgoingEdgesOpacity:function(e){u.each(this.get("outgoingEdges"),function(t){t.setOpacity(e)})},animateOutgoingEdgesToAttr:function(e,t,n){u.each(this.get("outgoingEdges"),function(t){var n=e[t.getID()];t.animateToAttr(n)},this)},animateOutgoingEdges:function(e,t){u.each(this.get("outgoingEdges"),function(n){n.animateUpdatedPath(e,t)},this)},animateOutgoingEdgesFromSnapshot:function(e,t,n){u.each(this.get("outgoingEdges"),function(r){var i=e[r.getID()];r.animateToAttr(i,t,n)},this)},setOutgoingEdgesBirthPosition:function(e){u.each(this.get("outgoingEdges"),function(t){var n=t.get("head").getScreenCoords(),r=t.genSmoothBezierPathStringFromCoords(e,n);t.get("path").stop().attr({path:r,opacity:0})},this)},parentInFront:function(){this.get("commit").get("parents")[0].get("visNode").toFront()},getFontSize:function(e){return e.length<3?12:e.length<5?10:8},getFill:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));return e=="head"?f.headRectFill:e=="none"?f.orphanNodeFill:this.gitVisuals.getBlendedHuesForCommit(this.get("commit"))},attachClickHandlers:function(){if(this.get("gitVisuals").options.noClick)return;var t="git checkout "+this.get("commit").get("id"),n=e("../app");u.each([this.get("circle"),this.get("text")],function(e){e.click(function(){n.getEventBaton().trigger("commandSubmitted",t)}),$(e.node).css("cursor","pointer")})},setOpacity:function(e){e=e===undefined?1:e;var t=["circle","text"];u.each(t,function(t){this.get(t).attr({opacity:e})},this)},remove:function(){this.removeKeys(["circle"],["text"]);var e=this.get("text");e&&e.remove(),this.gitVisuals.removeVisNode(this)},removeAll:function(){this.remove(),u.each(this.get("outgoingEdges"),function(e){e.remove()},this)},getExplodeStepFunc:function(){var e=this.get("circle"),t=20,n=Math.PI+Math.random()*1*Math.PI,r=.2,i=.01,s=t*Math.cos(n),o=t*Math.sin(n),u=e.attr("cx"),a=e.attr("cy"),f=this.gitVisuals.paper.width,l=this.gitVisuals.paper.height,c=.8,h=1,p=function(){o+=r*h-i*o,s-=i*s,u+=s*h,a+=o*h;if(u<0||u>f)s=c*-s,u=u<0?0:f;if(a<0||a>l)o=c*-o,a=a<0?0:l;return e.attr({cx:u,cy:a}),s*s+o*o<.01&&Math.abs(a-l)===0?!1:!0};return p},genGraphics:function(){var e=this.gitVisuals.paper,t=this.getScreenCoords(),n=this.getTextScreenCoords(),r=e.circle(t.x,t.y,this.getRadius()).attr(this.getAttributes().circle),i=e.text(n.x,n.y,String(this.get("id")));i.attr({"font-size":this.getFontSize(this.get("id")),"font-weight":"bold","font-family":"Monaco, Courier, font-monospace",opacity:this.getOpacity()}),this.set("circle",r),this.set("text",i),this.attachClickHandlers()}});n.VisNode=c}),e("/src/js/visuals/visNode.js"),e.define("/src/js/visuals/visualization.js",function(e,t,n,r,i,s,o){var u=e("underscore"),a=e("../util").isBrowser()?a=window.Backbone:a=e("backbone"),f=e("../models/collections"),l=f.CommitCollection,c=f.BranchCollection,h=e("../util/eventBaton").EventBaton,p=e("../visuals").GitVisuals,d=a.View.extend({initialize:function(e){e=e||{},this.options=e,this.customEvents=u.clone(a.Events),this.containerElement=e.containerElement;var t=this,n=e.containerElement||$("#canvasHolder")[0];new Raphael(n,200,200,function(){var n=this;s.nextTick(function(){t.paperInitialize(n,e)})})},paperInitialize:function(t,n){this.treeString=n.treeString,this.paper=t;var r=e("../app");this.eventBaton=n.noKeyboardInput?new h:r.getEventBaton(),this.commitCollection=new l,this.branchCollection=new c,this.gitVisuals=new p({commitCollection:this.commitCollection,branchCollection:this.branchCollection,paper:this.paper,noClick:this.options.noClick,smallCanvas:this.options.smallCanvas});var i=e("../git").GitEngine;this.gitEngine=new i({collection:this.commitCollection,branches:this.branchCollection,gitVisuals:this.gitVisuals,eventBaton:this.eventBaton}),this.gitEngine.init(),this.gitVisuals.assignGitEngine(this.gitEngine),this.myResize(),$(window).on("resize",u.bind(function(){this.myResize()},this)),this.gitVisuals.drawTreeFirstTime(),this.treeString&&this.gitEngine.loadTreeFromString(this.treeString),this.options.zIndex&&this.setTreeIndex(this.options.zIndex),this.shown=!1,this.setTreeOpacity(0),s.nextTick(u.bind(this.fadeTreeIn,this)),this.customEvents.trigger("gitEngineReady"),this.customEvents.trigger("paperReady")},setTreeIndex:function(e){$(this.paper.canvas).css("z-index",e)},setTreeOpacity:function(e){e===0&&(this.shown=!1),$(this.paper.canvas).css("opacity",e)},getAnimationTime:function(){return 300},fadeTreeIn:function(){this.shown=!0,$(this.paper.canvas).animate({opacity:1},this.getAnimationTime())},fadeTreeOut:function(){this.shown=!1,$(this.paper.canvas).animate({opacity:0},this.getAnimationTime())},hide:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){$(this.paper.canvas).css("visibility","hidden")},this),this.getAnimationTime())},show:function(){$(this.paper.canvas).css("visibility","visible"),setTimeout(u.bind(this.fadeTreeIn,this),10)},showHarsh:function(){$(this.paper.canvas).css("visibility","visible"),this.setTreeOpacity(1)},resetFromThisTreeNow:function(e){this.treeString=e},reset:function(e){var t=e||this.treeString;this.setTreeOpacity(0),this.treeString?this.gitEngine.loadTreeFromString(t):this.gitEngine.defaultInit(),this.fadeTreeIn()},tearDown:function(){this.gitEngine.tearDown(),this.gitVisuals.tearDown(),delete this.paper},die:function(){this.fadeTreeOut(),setTimeout(u.bind(function(){this.shown||this.tearDown()},this),this.getAnimationTime())},myResize:function(){if(!this.paper)return;var e=1,t=this.el,n=t.clientWidth-e,r=t.clientHeight-e;if(!this.containerElement){var i=t.offsetLeft,s=t.offsetTop;$(this.paper.canvas).css({position:"absolute",left:i+"px",top:s+"px"})}this.paper.setSize(n,r),this.gitVisuals.canvasResize(n,r)}});n.Visualization=d}),e("/src/js/visuals/visualization.js"),e.define("/src/levels/advanced/multipleParents.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C7","id":"master"},"bugWork":{"target":"C2","id":"bugWork"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"master","id":"HEAD"}}',solutionCommand:"git branch bugWork master^^2^",startTree:'{"branches":{"master":{"target":"C7","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"master","id":"HEAD"}}',name:{en_US:"Multiple parents"},hint:{en_US:"Use `git branch bugWork` with a target commit to create the missing reference."},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["### Specifying Parents","","Like the `~` modifier, the `^` modifier also accepts an optional number after it.","","Rather than specifying the number of generations to go back (what `~` takes), the modifier on `^` specifies which parent reference to follow from a merge commit. Remember that merge commits have multiple parents, so the path to choose is ambiguous.","",'Git will normally follow the "first" parent upwards from a merge commit, but specifying a number with `^` changes this default behavior.',"","Enough talking, let's see it in action.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have a merge commit. If we checkout `master^` without the modifier, we will follow the first parent after the merge commit. ","","(*In our visuals, the first parent is positioned directly above the merge commit.*)"],afterMarkdowns:["Easy -- this is what we are all used to."],command:"git checkout master^",beforeCommand:"git checkout HEAD^; git commit; git checkout master; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now let's try specifying the second parent instead..."],afterMarkdowns:["See? We followed the other parent upwards."],command:"git checkout master^2",beforeCommand:"git checkout HEAD^; git commit; git checkout master; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["The `^` and `~` modifiers can make moving around a commit tree very powerful:"],afterMarkdowns:["Lightning fast!"],command:"git checkout HEAD~; git checkout HEAD^2; git checkout HEAD~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Even crazier, these modifiers can be chained together! Check this out:"],afterMarkdowns:["The same movement as before, but all in one command."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Put it to practice","","To complete this level, create a new branch at the specified destination.","","Obviously it would be easy to specify the commit directly (with something like `C6`), but I challenge you to use the modifiers we talked about instead!"]}}]}}}}),e("/src/levels/advanced/multipleParents.js"),e.define("/src/levels/index.js",function(e,t,n,r,i,s,o){n.levelSequences={intro:[e("../../levels/intro/commits").level,e("../../levels/intro/branching").level,e("../../levels/intro/merging").level,e("../../levels/intro/rebasing").level],rampup:[e("../../levels/rampup/detachedHead").level,e("../../levels/rampup/relativeRefs").level,e("../../levels/rampup/relativeRefs2").level,e("../../levels/rampup/reversingChanges").level],rebase:[e("../../levels/rebase/manyRebases").level,e("../../levels/rebase/selectiveRebase").level],mixed:[e("../../levels/mixed/grabbingOneCommit").level,e("../../levels/mixed/jugglingCommits").level,e("../../levels/mixed/jugglingCommits2").level],advanced:[e("../../levels/advanced/multipleParents").level]},n.sequenceInfo={intro:{displayName:{en_US:"Introduction Sequence",fr_FR:"Sequence d'introduction",zh_CN:"",ko:" "},about:{en_US:"A nicely paced introduction to the majority of git commands",fr_FR:"Une introduction en douceur à la majoité des commandes git",zh_CN:" Git ",ko:" git "}},rampup:{displayName:{en_US:"Ramping Up"},about:{en_US:"The next serving of 100% git awesomes-ness. Hope you're hungry"}},rebase:{displayName:{en_US:"Master the Rebase Luke!",fr_FR:"Maîtrise Rebase, Luke!",zh_CN:"",ko:" !"},about:{en_US:"What is this whole rebase hotness everyone is talking about? Find out!",fr_FR:"Que'est-ce que c'est que ce rebase dont tout le monde parle ? Découvrez-le !",ko:" rebase !",zh_CN:""}},mixed:{displayName:{en_US:"A Mixed Bag",fr_FR:"Un assortiment",ko:"",zh_CN:""},about:{en_US:"A mixed bag of Git techniques, tricks, and tips",fr_FR:"Un assortiment de techniques et astuces pour utiliser Git",ko:"Git ",zh_CN:"Git"}},advanced:{displayName:{en_US:"Advanced Topics"},about:{en_US:"For the truly brave!"}}}}),e("/src/levels/index.js"),e.define("/src/levels/intro/branching.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C1","id":"master"},"bugFix":{"target":"C1","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',solutionCommand:"git branch bugFix;git checkout bugFix",name:{en_US:"Branching in Git",ko:"Git ",fr_FR:"Gérer les branches avec Git",zh_CN:"Git"},hint:{en_US:'Make a new branch with "git branch [name]" and check it out with "git checkout [name]"',fr_FR:'Faites une nouvelle branche avec "git branch [nom]" positionnez-vous dans celle-ci avec "git checkout [nom]"',zh_CN:" 'git branch []' 'git checkout []' ",ko:'"git branch []" , "git checkout []" '},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branches","","Branches in Git are incredibly lightweight as well. They are simply references to a specific commit -- nothing more. This is why many Git enthusiasts chant the mantra:","","```","branch early, and branch often","```","","Because there is no storage / memory overhead with making many branches, it's easier to logically divide up your work than have big beefy branches.","",'When we start mixing branches and commits, we will see how these two features combine. For now though, just remember that a branch essentially says "I want to include the work of this commit and all parent commits."']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what branches look like in practice.","","Here we will check out a new branch named `newImage`"],afterMarkdowns:["There, that's all there is to branching! The branch `newImage` now refers to commit `C1`"],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's try to put some work on this new branch. Hit the button below"],afterMarkdowns:["Oh no! The `master` branch moved but the `newImage` branch didn't! That's because we weren't \"on\" the new branch, which is why the asterisk (*) was on `master`"],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's tell git we want to checkout the branch with","","```","git checkout [name]","```","","This will put us on the new branch before committing our changes"],afterMarkdowns:["There we go! Our changes were recorded on the new branch"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ok! You are all ready to get branching. Once this window closes,","make a new branch named `bugFix` and switch to that branch"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches Git","","Les branches sous Git sont incroyablement légères aussi. Elles sont simplment des références un commit spécifique -- rien de plus. C'est pourquoi beaucoup d'enthousiastes répètent en cœur :","","```","n'attendez pas pour faire des branches, et faites souvent des branches","```","","Parce qu'il n'y a pas de surcoût (stockage/mémoire) associés aux branches, il est facile de diviser son travail en de nombreuses branches plutôt que d'avoir quelques grosses branches.","","Nous verrons comment les banches et les commits interagissent quand nous les utiliserons ensemble. Pour l'instant, souvenez-vous qu'une branche est un moyen d'exprimer \"Je veux inclure le contenu de ce commit et de tous les commits parents.\""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Regardons à quoi ressemblent les branches en pratique.","","Nous allons nous positionner (checkout) dans une nouvelle branche appellée `newImage`"],afterMarkdowns:["Et voilà, c'est tout ! La branche `newImage` se réfère désormais au commit `C1`"],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Travaillons mainenant dans cette branche. Appuyez sur le bouton ci-dessous."],afterMarkdowns:["Oh non! La branche `master` a bougé mais pas la branche `newImage` ! C'est parce aue nous n'étions pas \"sur\" la nouvelle branche, comme indiqué par l'asterisque (*) sur `master`"],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Indiquons à git que nous voulons nous positionner sur la branche avec ","","```","git checkout [nom]","```","","Ceci nous positionne sur la nouvelle branche avant de faire un commit avec nos modifications"],afterMarkdowns:["C'est parti ! Nos modifications ont été enregistrées sur la nouvelle branche"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ok! Vous êtes fin prêt pour faire des branches. Après la fermeture de cette fenêtre,","faites une nouvelle branche nommée `bugFix` et positionnez-vous sur cette branche"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branches",""," Git reference Git ","","```","branch early, and branch often","```","","使使beefy","","使使I want to include the work of this commit and all parent commits."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["","","check out `newImage` "],command:"git branch newImage",afterMarkdowns:["`newImage` `C1`"],beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[""],command:"git commit",afterMarkdowns:["`master` `newImage` * `master` "],beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" git","","```","git checkout [name]","```","",""],command:"git checkout newImage; git commit",afterMarkdowns:[""],beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["使"," `bugFix` "]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git ",""," . (reference) . Git :","","```"," , ","```",""," , , .","",' , . , " " .']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" .","","`newImage` ."],afterMarkdowns:[" ! `newImage` `C1` "],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" . "],afterMarkdowns:["! `master` , `newImage` ! . (*) `master` ."],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" .","","```","git checkout []","```",""," ."],afterMarkdowns:["! !"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["! . ,","`bugFix` , "]}}]}}}}),e("/src/levels/intro/branching.js"),e.define("/src/levels/intro/commits.js",function(e,t,n,r,i,s,o){n.level={name:{en_US:"Introduction to Git Commits",fr_FR:"Introduction aux commits avec Git",ko:"Git ",zh_CN:"Git"},goalTreeString:'{"branches":{"master":{"target":"C3","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"master","id":"HEAD"}}',solutionCommand:"git commit;git commit",startTree:'{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}',hint:{en_US:"Just type in 'git commit' twice to finish!",fr_FR:"Il suffit de saisir 'git commit' deux fois pour réussir !",zh_CN:" 'git commit' ",ko:"'git commit' !"},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","A commit in a git repository records a snapshot of all the files in your directory. It's like a giant copy and paste, but even better!","","Git wants to keep commits as lightweight as possible though, so it doesn't just copy the entire directory every time you commit. It actually stores each commit as a set of changes, or a \"delta\", from one version of the repository to the next. That's why most commits have a parent commit above them -- you'll see this later in our visualizations.","",'In order to clone a repository, you have to unpack or "resolve" all these deltas. That\'s why you might see the command line output:',"","`resolving deltas`","","when cloning a repo.","","It's a lot to take in, but for now you can think of commits as snapshots of the project. Commits are very light and switching between them is wicked fast!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what this looks like in practice. On the right we have a visualization of a (small) git repository. There are two commits right now -- the first initial commit, `C0`, and one commit after that `C1` that might have some meaningful changes.","","Hit the button below to make a new commit"],afterMarkdowns:["There we go! Awesome. We just made changes to the repository and saved them as a commit. The commit we just made has a parent, `C1`, which references which commit it was based off of."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Go ahead and try it out on your own! After this window closes, make two commits to complete the level"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commits Git","Un commit dans un dépôt (repository) git enregistre une image (snapshot) de tous les fichiers du repertoire. Comme un Copier-Coller géant, mais en bien mieux !","","Git fait en sorte que les commits soient aussi légers que possible donc il ne recopie pas tous le répertoire à chaque commit. En fait, git n'enregistre que l'ensemble des changments (\"delta\") depuis la version précédante du dépôt. C'est pour cette raison que la plupart des commits ont un commit parent -- ainsi que nous le verrons plus tard.","",'Pour cloner un dépôt, il faut décompresser ("résoudre") tous ces deltas. C\'est la raison pour laquelle la commande écrit :',"","`resolving deltas`","","lorsque l'on clone un dépôt.","","C'est beaucoup à absorber, mais pour l'instant vous pouvez considérer les commits comme des snapshots du projet. Les commits sont très légers et passer de l'un à l'autre est très rapide !"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Voyons à quoi cela ressemble en pratique. Sur la droite, on peut visualiser un (petit) dépôt git. Il y a pour l'instant deux commits -- le premier commit initial, `C0`, et un commit suivant `C1` qui aurait des changements significatifs.","","Appuyez sur le bouton ci-dessous pour faire un nouveau commit"],afterMarkdowns:["C'est parti ! Super. Nous venons de faire des modifications sur le dépôt et de saugevarder celles-ci dans un commit. Ce commit que nous venons de faire a un parent, `C1`, qui référence le commit sur lequel il est basé."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Allez-y et essayez par vous-même ! Après la fermeture de cettefenêtre, faites deux commits pour terminer ce niveau."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git "," Git . !","",'Git , . ("delta" ) . . -- .',""," (clone), (delta) , . ","","`resolving deltas`",""," , . !"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" . git . -- `C0`, `C1` .",""," "],afterMarkdowns:[" ! . . `C1`, ."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:[" ! , "]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","使 git commit git ","",'Git " delta"parent commit -- ',"","cloneunpackresolve","","`resolving deltas`","",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["使 git `C0``C1`","",""],command:"git commit",afterMarkdowns:["parent `C1``C1`"],beforeCommand:""}},{type:"ModalAlert",options:{markdowns:[""]}}]}}}}),e("/src/levels/intro/commits.js"),e.define("/src/levels/intro/merging.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C4","id":"master"},"bugFix":{"target":"C2","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3","C2"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}',solutionCommand:"git checkout -b bugFix;git commit;git checkout master;git commit;git merge bugFix",name:{en_US:"Merging in Git",fr_FR:"Faire des 'merge' (fusions de branches) avec Git",ko:"Git (Merge)",zh_CN:"Git(Merge)"},hint:{en_US:"Remember to commit in the order specified (bugFix before master)",fr_FR:"Pensez à faire des commits dans l'ordre indiqué (bugFix avant master)",zh_CN:"(commit) bugFix master ",ko:" (bugFix master )"},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches and Merging","","Great! We now know how to commit and branch. Now we need to learn some kind of way of combining the work from two different branches together. This will allow us to branch off, develop a new feature, and then combine it back in.","",'The first method to combine work that we will examine is `git merge`. Merging in Git creates a special commit that has two unique parents. A commit with two parents essentially means "I want to include all the work from this parent over here and this one over here, *and* the set of all their parents."',"","It's easier with visuals, let's check it out in the next view"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches; each has one commit that's unique. This means that neither branch includes the entire set of \"work\" in the repository that we have done. Let's fix that with merge.","","We will `merge` the branch `bugFix` into `master`"],afterMarkdowns:["Woah! See that? First of all, `master` now points to a commit that has two parents. If you follow the arrows upstream from `master`, you will hit every commit along the way to the root. This means that `master` contains all the work in the repository now.","","Also, see how the colors of the commits changed? To help with learning, I have included some color coordination. Each branch has a unique color. Each commit turns a color that is the blended combination of all the branches that contain that commit.","","So here we see that the `master` branch color is blended into all the commits, but the `bugFix` color is not. Let's fix that..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's merge `master` into `bugFix`:"],afterMarkdowns:["Since `bugFix` was downstream of `master`, git didn't have to do any work; it simply just moved `bugFix` to the same commit `master` was attached to.","","Now all the commits are the same color, which means each branch contains all the work in the repository! Woohoo"],command:"git checkout bugFix; git merge master",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following steps:","","* Make a new branch called `bugFix`","* Checkout the `bugFix` branch with `git checkout bugFix`","* Commit once","* Go back to `master` with `git checkout`","* Commit another time","* Merge the branch `bugFix` into `master` with `git merge`","",'*Remember, you can always re-display this dialog with "help level"!*']}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches et Merges","","Super! Nous savons désormais comment faire des commits et de branches. Maintenant nous devons apprendre comment combiner ensemble les contenus de deux branches différentes. Ceci nous permettra de créer une nouvelle branche, développer une nouvelle fonctionnalité sur cette dernière, puis intégrer cette fonctionnalité en combinant le contenu de cette branche de développement à la branche d'origine(master par exemple).","","La première méthode que nous alons voir pour combiner le conenu de deux branches est `git merge`. Faire un 'merge' en git Git crée un commit spécial qui a deux parents. Un commit avec deux parents indique en susbtance \"Je veux inclure le contenu de ce parent et le conenu de cet autre parent, *et* l'ensemble de leurs parents.\"","","C'est plus facile en visualisant, regardons dans la vue suivante"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches; each has one commit that's unique. This means that neither branch includes the entire set of \"work\" in the repository that we have done. Let's fix that with merge.","","We will `merge` the branch `bugFix` into `master`"],afterMarkdowns:["Woah! See that? First of all, `master` now points to a commit that has two parents. If you follow the arrows upstream from `master`, you will hit every commit along the way to the root. This means that `master` contains all the work in the repository now.","","Also, see how the colors of the commits changed? To help with learning, I have included some color coordination. Each branch has a unique color. Each commit turns a color that is the blended combination of all the branches that contain that commit.","","So here we see that the `master` branch color is blended into all the commits, but the `bugFix` color is not. Let's fix that..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Faisons un merge de `master` dans `bugFix`:"],afterMarkdowns:["Puisque `bugFix` était un descendant de `master`, git n'avait aucun travail à effectuer; il a simplement déplacé `bugFix` au même commit auquel `master` est attaché.","","Maintenant tous les commits sont de la même couleur, ce qui indique que chaque branche contient tout le contenu du dépôt ! Woohoo"],command:"git checkout bugFix; git merge master",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Pour accomplir ce niveau, effectuez les opérations suivantes :","","* Faites une nouvelle branche appelée `bugFix`","* Positionnez-vous sur la branche `bugFix` avec `git checkout bugFix`","* Faites un commit","* Retournez sur la branche `master` (commande `git checkout`)","* Faites un nouveau commit","* Fusionnez la branche `bugFix` dans `master` avec `git merge`","",'*Rappelez-vous que vous pouvez à tout moment réafficher ces indications avec "help level"!*']}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches and Merging","","Great! 使西西",""," `git merge` Git Mergingcommit**","",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["",""," `bugFix` `master` "],command:"git merge bugFix",afterMarkdowns:["`master` `master` 沿沿 `master` ","","",""," `master` `bugFix` "],beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" `master` `bugFix` "],command:"git checkout bugFix; git merge master",afterMarkdowns:[" `bugFix` `master` git `master` `bugFix` ","","西"],beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["","","* `bugFix` ","* `git checkout bugFix` `bugFix`","* ","* `git checkout` `master` ","* ","* `git merge` `bugFix` `master` ","",'*使 "help level" *']}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## (Merge)","","! . . , .","",' `git merge`. Git (merge) (parent) . " , ** " . ',""," . ."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" . . . (merge) ?","","`bugFix` `master` (merge) ."],afterMarkdowns:["? , `master` . ","",", ? . . , .",""," `bugFix` `master` . ..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" `master` `bugFix` (merge) :"],afterMarkdowns:["`bugFix` `master` , git ; `bugFix` `master` .","","! , ."],command:"git checkout bugFix; git merge master",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:[" :","","* `bugFix` ","* `git checkout bugFix` `bugFix` (checkout).","* ","* `git checkout` `master` ","* ","* `git merge` `bugFix` `master` .","",'* , "help level" !*']}}]}}}}),e("/src/levels/intro/merging.js"),e.define("/src/levels/intro/rebasing.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22bugFix%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout -b bugFix;git commit;git checkout master;git commit;git checkout bugFix;git rebase master",name:{en_US:"Rebase Introduction",fr_FR:"Introduction à rebase",ko:"(rebase) ",zh_CN:"(rebase)"},hint:{en_US:"Make sure you commit from bugFix first",fr_FR:"Assurez-vous de bien faire votre en premier votre commit sur bugFix",ko:"bugFix ",zh_CN:" bugFix "},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'The second way of combining work between branches is *rebasing.* Rebasing essentially takes a set of commits, "copies" them, and plops them down somewhere else.',"","While this sounds confusing, the advantage of rebasing is that it can be used to make a nice linear sequence of commits. The commit log / history of the repository will be a lot cleaner if only rebasing is allowed.","","Let's see it in action..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches yet again; note that the bugFix branch is currently selected (note the asterisk)","","We would like to move our work from bugFix directly onto the work from master. That way it would look like these two features were developed sequentially, when in reality they were developed in parallel.","","Let's do that with the `git rebase` command"],afterMarkdowns:["Awesome! Now the work from our bugFix branch is right on top of master and we have a nice linear sequence of commits.","",'Note that the commit C3 still exists somewhere (it has a faded appearance in the tree), and C3\' is the "copy" that we rebased onto master.',"","The only problem is that master hasn't been updated either, let's do that now..."],command:"git rebase master",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now we are checked out on the `master` branch. Let's do ahead and rebase onto `bugFix`..."],afterMarkdowns:["There! Since `master` was downstream of `bugFix`, git simply moved the `master` branch reference forward in history."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following","","* Checkout a new branch named `bugFix`","* Commit once","* Go back to master and commit again","* Check out bugFix again and rebase onto master","","Good luck!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'La seconde façon de combiner les contenus de deux branches est *rebase*. Rebase prend un enselble de commits, les "recopie", et les ajoute en bout de chaine à un autre endroit.',"","Bien que cela puisse sembler compliqué, l'avantage de rebase est de permettre d'obtenir une simple séquence linéeire de commits. Les logs/l'historique du dépôt seront bien plus propres si seul rebase est autorisé (plutôt que merge).","","Voyons rebase en action"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ici nous avons encore une fois deux branches; notez que nous sommes sur la branche bugFix (cf. l'asterisque)","","Nous voudrions transferer notre travail sur la branche 'bugFix' directement sur le travail dans 'master'. Ainsi on aurait l'impression que ces deux travaux ont été développés séquentiellement alors qu'en réalité ils ont été réalisés en parallèle.","","Faisons cela avec la commande `git rebase`"],afterMarkdowns:["Super! Désormais, le travail de la branche 'bugFix' est juste en haut de la branche 'master' et non avons une belle séquence linéaire de commits.","","Notez que le commit C3 existe toujours quelquepart (il est en grisé sur l'arbre), et C3' est la \"copie\" que nous avons créée sur master avec rebase.","","Le seul problème est que master n'a pas été mis à jour, faisons cela maintenant"],command:"git rebase master",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nous sommes désormais positionnés sur la branche `master`. Continuons en faisant le rebase sur `bugFix`","Et voilà ! Puisque `master` était un ascendant de `bugFix`, git a simplement déplacé la référence de la branche `master` en avant dans le temps."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"}},{type:"ModalAlert",options:{markdowns:["Pour acomplir ce niveau, faites les opérations suivantes","","* Positionnez-vous (checkout) sur une nouvelle branche nommée `bugFix`","* Faites un commit","* Retournez sur master et faites un nouveau commit","* Positionnez-vous à nouveau sur bugFix et faites un rebase sur master","","Bonne chance !"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",' *rebasing*"compies"',"","线使/","",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" bugFix",""," bugfix master 使",""," `git rebase`"],command:"git rebase master",afterMarkdowns:[" bugFix master 线","",' C3 C3\' master ""',""," master "],beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" `master` `bugFix` "],command:"git rebase bugFix",afterMarkdowns:[" `master` `bugFix` git `master` `bugFix` "],beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"}},{type:"ModalAlert",options:{markdowns:["","","* `bugFix` ","* ","* master ","* bugFix master ","",""]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git (Rebase)",""," *(rebase)*. , .",""," , . .",""," ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" ; bugFix ( )","","bugFix master . , , .","","`git rebase` ."],afterMarkdowns:["! bugFix master .","","C3 ( ), C3' master .","","master , ..."],command:"git rebase master",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" `master` . `bugFix` ..."],afterMarkdowns:["! `master` `bugFix` , ."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"}},{type:"ModalAlert",options:{markdowns:[" ","","* `bugFix` ","* ","* master ","* bugFix master ","","!"]}}]}}}}),e("/src/levels/intro/rebasing.js"),e.define("/src/levels/mixed/grabbingOneCommit.js",function(e,t,n,r,i,s,o){n.level={compareOnlyMasterHashAgnosticWithAsserts:!0,goalAsserts:{master:[function(e){return e.C4>e.C1}]},disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22master%22%7D%2C%22debug%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22debug%22%7D%2C%22printf%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22printf%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout master;git cherry-pick C4",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"debug":{"target":"C2","id":"debug"},"printf":{"target":"C3","id":"printf"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',name:{ko:" ",en_US:"Grabbing Just 1 Commit",zh_CN:""},hint:{en_US:"Remember, interactive rebase or cherry-pick is your friend here",ko:" (rebase -i) or (cherry-pick) ",zh_CN:" rebase cherry-pick "},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Locally stacked commits","","Here's a development situation that often happens: I'm trying to track down a bug but it is quite elusive. In order to aid in my detective work, I put in a few debug commands and a few print statements.","","All of these debugging / print statements are in their own branches. Finally I track down the bug, fix it, and rejoice!","","Only problem is that I now need to get my `bugFix` back into the `master` branch! I could simply fast-forward `master`, but then `master` would get all my debug statements."]}},{type:"ModalAlert",options:{markdowns:["This is where the magic of Git comes in. There are a few ways to do this, but the two most straightforward ways are:","","* `git rebase -i`","* `git cherry-pick`","","Interactive (the `-i`) rebasing allows you to choose which commits you want to keep or discard. It also allows you to reorder commits. This can be helpful if you want to toss out some work.","","Cherry-picking allows you to pick individual commits and plop them down on top of `HEAD`"]}},{type:"ModalAlert",options:{markdowns:["This is a later level so we will leave it up to you to decide, but in order to complete the level, make sure `master` receives the commit that `bugFix` references."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## (Locally stacked commits)",""," bug debug ",""," bug fix ",""," `bugFix` `master` fast-forward `master` `master` "]}},{type:"ModalAlert",options:{markdowns:[" Git ","","* `git rebase -i`","* `git cherry-pick`","","`-i`","","Cherry-picking `HEAD` "]}},{type:"ModalAlert",options:{markdowns:["便 `master` `bugFix` references"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## ",""," : , . ",""," . , !",""," `bugFix` `master` , . `master` (fast-forward) ."]}},{type:"ModalAlert",options:{markdowns:[" Git . , :","","* `git rebase -i`","* `git cherry-pick`",""," (-i ) (rebase) . . .","","(cherry-pick) `HEAD` ."]}},{type:"ModalAlert",options:{markdowns:[" , `master` `bugFix` ."]}}]}}}}),e("/src/levels/mixed/grabbingOneCommit.js"),e.define("/src/levels/mixed/jugglingCommits.js",function(e,t,n,r,i,s,o){n.level={disabledMap:{"git cherry-pick":!0,"git revert":!0},compareOnlyMasterHashAgnosticWithAsserts:!0,goalAsserts:{master:[function(e){return e.C2>e.C3},function(e){return e.C2>e.C1}]},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22master%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C2%27%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i HEAD~2;git commit --amend;git rebase -i HEAD~2;git rebase caption master",startTree:'{"branches":{"master":{"target":"C1","id":"master"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',name:{ko:" ",en_US:"Juggling Commits",zh_CN:""},hint:{en_US:"The first command is git rebase -i HEAD~2",ko:" git rebase -i HEAD~2 ",zh_CN:" 'git rebase -i HEAD~2'"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits","","Here's another situation that happens quite commonly. You have some changes (`newImage`) and another set of changes (`caption`) that are related, so they are stacked on top of each other in your repository (aka one after another).","","The tricky thing is that sometimes you need to make a small modification to an earlier commit. In this case, design wants us to change the dimensions of `newImage` slightly, even though that commit is way back in our history!!"]}},{type:"ModalAlert",options:{markdowns:["We will overcome this difficulty by doing the following:","","* We will re-order the commits so the one we want to change is on top with `git rebase -i`","* We will `commit --amend` to make the slight modification","* Then we will re-order the commits back to how they were previously with `git rebase -i`","* Finally, we will move master to this updated part of the tree to finish the level (via the method of your choosing)","","There are many ways to accomplish this overall goal (I see you eye-ing cherry-pick), and we will see more of them later, but for now let's focus on this technique."]}},{type:"ModalAlert",options:{markdowns:["Lastly, pay attention to the goal state here -- since we move the commits twice, they both get an apostrophe appended. One more apostrophe is added for the commit we amend, which gives us the final form of the tree ","","That being said, I can compare levels now based on structure and relative apostrophe differences. As long as your tree's `master` branch has the same structure and relative apostrophe differences, I'll give full credit"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## ",""," `newImage` `caption` stacked on top of each other in your repository",""," `newImage` change the dimensions slightly"]}},{type:"ModalAlert",options:{markdowns:["","","* `git rebase -i` ","* `commit --amend` ","* `git rebase -i` ","* master ",""," cherry-pick "]}},{type:"ModalAlert",options:{markdowns:[" both get an apostrophe appended"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## ",""," . `newImage` `caption` , .",""," . (history) `newImage` ."]}},{type:"ModalAlert",options:{markdowns:[" :","","* `git rebase -i` ","* `commit --amend` ","* `git rebase -i` ","* , master . ( )",""," ( ?), , ."]}},{type:"ModalAlert",options:{markdowns:[", -- , . (amend) ."]}}]}}}}),e("/src/levels/mixed/jugglingCommits.js"),e.define("/src/levels/mixed/jugglingCommits2.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22master%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout master;git cherry-pick C2;git commit --amend;git cherry-pick C3",disabledMap:{"git revert":!0},startTree:'{"branches":{"master":{"target":"C1","id":"master"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',compareOnlyMasterHashAgnosticWithAsserts:!0,goalAsserts:{master:[function(e){return e.C2>e.C3},function(e){return e.C2>e.C1}]},name:{ko:" #2",en_US:"Juggling Commits #2",zh_CN:" #2"},hint:{en_US:"Don't forget to forward master to the updated changes!",ko:"master (forward) !",zh_CN:" master "},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits #2","","*If you haven't completed Juggling Commits #1 (the previous level), please do so before continuing*","","As you saw in the last level, we used `rebase -i` to reorder the commits. Once the commit we wanted to change was on top, we could easily --amend it and re-order back to our preferred order.","","The only issue here is that there is a lot of reordering going on, which can introduce rebase conflicts. Let's look at another method with `git cherry-pick`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Remember that git cherry-pick will plop down a commit from anywhere in the tree onto HEAD (as long as that commit isn't upstream).","","Here's a small refresher demo:"],afterMarkdowns:["Nice! Let's move on"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"ModalAlert",options:{markdowns:["So in this level, let's accomplish the same objective of amending `C2` once but avoid using `rebase -i`. I'll leave it up to you to figure it out! :D","","Remember, the exact number of apostrophe's (') on the commit are not important, only the relative differences. For example, I will give credit to a tree that matches the goal tree but has one extra apostrophe everywhere"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## #2","","* #1*","","使 `rebase -i` ","","rebase conflicts `git cherry-pick` "]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" cherry-pick HEAD ","",""],command:"git cherry-pick C2",afterMarkdowns:[""],beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"ModalAlert",options:{markdowns:[" `C2`使 `rebase -i` :D"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## #2","","* #1 , *",""," `rebase -i` . (top) --amend , .",""," , . `git cherry-pick` ."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["git cherry-pick HEAD ? (, )",""," :"],afterMarkdowns:["! "],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout master; git commit"}},{type:"ModalAlert",options:{markdowns:[" `C2` , `rebase -i` . ^.~"]}}]}}}}),e("/src/levels/mixed/jugglingCommits2.js"),e.define("/src/levels/rampup/detachedHead.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"C4","id":"HEAD"}}',solutionCommand:"git checkout C4",startTree:'{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}',name:{en_US:"Detach yo' HEAD"},hint:{en_US:"Use the label (hash) on the commit for help!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Moving around in Git","","Before we get to some of the more advanced features of Git, it's important to understand different ways to move through the commit tree that represents your project.","","Once you're comfortable moving around, your powers with other git commands will be amplified!","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","","First we have to talk about \"HEAD\". HEAD is the symbolic name for the currently checked out commit -- it's essentially what commit you're working on top of.","","HEAD always points to the most recent commit which is reflected in the working tree. Most git commands which make changes to the working tree will start by changing HEAD.","","Normally HEAD points to a branch name (like bugFix). When you commit, the status of bugFix is altered and this change is visible through HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see this in action. Here we will reveal HEAD before and after a commit."],afterMarkdowns:["See! HEAD was hiding underneath our `master` branch all along."],command:"git checkout C1; git checkout master; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Detaching HEAD","","Detaching HEAD just means attaching it to a commit instead of a branch. This is what it looks like beforehand:","","HEAD -> master -> C1",""],afterMarkdowns:["And now it's","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["To complete this level, let's detach HEAD from `bugFix` and attach it to the commit instead.","","Specify this commit by its hash. The hash for each commit is displayed on the circle that represents the commit."]}}]}}}}),e("/src/levels/rampup/detachedHead.js"),e.define("/src/levels/rampup/relativeRefs.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"C3","id":"HEAD"}}',solutionCommand:"git checkout bugFix^",startTree:'{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}',name:{en_US:"Relative Refs (^)"},hint:{en_US:"Remember the Caret (^) operator!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Relative Refs","","Moving around in Git by specifying commit hashes can get a bit tedious. In the real world you won't have a nice commit tree visualization next to your terminal, so you'll have to use `git log` to see hashes.","","Furthermore, hashes are usually a lot longer in the real Git world as well. For instance, the hash of the commit that introduced the previous level is `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Doesn't exactly roll off the tongue...","","The upside is that Git is smart about hashes. It only requires you to specify enough characters of the hash until it uniquely identifies the commit. So I can type `fed2` instead of the long string above."]}},{type:"ModalAlert",options:{markdowns:["Like I said, specifying commits by their hash isn't the most convenient thing ever, which is why Git has relative refs. They are awesome!","","With relative refs, you can start somewhere memorable (like the branch `bugFix` or `HEAD`) and work from there.","","Relative commits are powerful, but we will introduce two simple ones here:","","* Moving upwards one commit at a time with `^`","* Moving upwards a number of times with `~<num>`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's look at the Caret (^) operator first. Each time you append that to a ref name, you are telling Git to find the parent of the specified commit.","",'So saying `master^` is equivalent to "the first parent of `master`".',"","`master^^` is the grandparent (second-generation ancestor) of `master`","","Let's check out the commit above master here"],afterMarkdowns:["Boom! Done. Way easier than typing the commit hash"],command:"git checkout master^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["You can also reference `HEAD` as a relative ref. Let's use that a couple of times to move upwards in the commit tree"],afterMarkdowns:["Easy! We can travel backwards in time with `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["To complete this level, check out the parent commit of `bugFix`. This will detach `HEAD`.","","You can specify the hash if you want, but try using relative refs instead!"]}}]}}}}),e("/src/levels/rampup/relativeRefs.js"),e.define("/src/levels/rampup/relativeRefs2.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:'{"branches":{"master":{"target":"C6","id":"master"},"bugFix":{"target":"C0","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"C1","id":"HEAD"}}',solutionCommand:"git branch -f master C6;git checkout HEAD~1;git branch -f bugFix HEAD~1",startTree:'{"branches":{"master":{"target":"C4","id":"master"},"bugFix":{"target":"C5","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"C2","id":"HEAD"}}',hint:{en_US:"You'll need to use at least one direct reference (hash) to complete this level"},name:{en_US:"Relative Refs #2 (~)"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:['### The "~" operator',"","Say you want to move a lot of levels up in the commit tree. It might be tedious to type `^` several times, so Git also has the tilde (~) operator.","","","The tilde operator (optionally) takes in a trailing number that specifies the number of parents you would like to ascend. Let's see it in action"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's specify a number of commits back with `~`."],afterMarkdowns:["Boom! So concise -- relative refs are great."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Branch forcing","","You're an expert on relative refs now, so let's actually *use* them for something.","","One of the most common ways I use relative refs is to move branches around. You can directly reassign a branch to a commit with the `-f` option. So something like:","","`git branch -f master HEAD~3`","","Moves (by force) the master branch to three parents behind HEAD."]}},{type:"ModalAlert",options:{markdowns:["To complete this level, move `HEAD`, `master`, and `bugFix` to their goal destinations shown."]}}]}}}}),e("/src/levels/rampup/relativeRefs2.js"),e.define("/src/levels/rampup/reversingChanges.js",function(e,t,n,r,i,s,o){n.level={goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%7D%2C%22pushed%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22pushed%22%7D%2C%22local%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22local%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22pushed%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git reset HEAD~1;git checkout pushed;git revert HEAD",compareOnlyBranches:!0,startTree:'{"branches":{"master":{"target":"C1","id":"master"},"pushed":{"target":"C2","id":"pushed"},"local":{"target":"C3","id":"local"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"local","id":"HEAD"}}',name:{en_US:"Reversing Changes in Git",fr_FR:"Annuler des changements avec Git",ko:"Git ",zh_CN:"Git "},hint:{en_US:"Notice that revert and reset take different arguments.",fr_FR:"",zh_CN:"",ko:""},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Reversing Changes in Git","","There are many ways to reverse changes in Git. And just like committing, reversing changes in Git has both a low-level component (staging individual files or chunks) and a high-level component (how the changes are actually reversed). Our application will focus on the latter.","","There are two primary ways to undo changes in Git -- one is using `git reset` and the other is using `git revert`. We will look at each of these in the next dialog",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` reverts changes by moving a branch reference backwards in time to an older commit. In this sense you can think of it as "rewriting history;" `git reset` will move a branch backwards as if the commit had never been made in the first place.',"","Let's see what that looks like:"],afterMarkdowns:["Nice! Git simply moved the master branch reference back to `C1`; now our local repository is in a state as if `C2` had never happened"],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'While reseting works great for local branches on your own machine, its method of "rewriting history" doesn\'t work for remote branches that others are using.',"","In order to reverse changes and *share* those reversed changes with others, we need to use `git revert`. Let's see it in action"],afterMarkdowns:["Weird, a new commit plopped down below the commit we wanted to reverse. That's because this new commit `C2'` introduces *changes* -- it just happens to introduce changes that exactly reverses the commit of `C2`.","","With reverting, you can push out your changes to share with others."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["To complete this level, reverse the two most recent commits on both `local` and `pushed`.","","Keep in mind that `pushed` is a remote branch and `local` is a local branch -- that should help you choose your methods."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Annuler des changements avec Git","","Il y a de nombreuses façons d'annuler des changement avec Git. De même que pour les commits, annuler des changements avec Git a à la fois un aspect bas-niveau (gestion dans le 'staging' des fichiers et morceaux de fichiers) et un aspect de plus haut niveau 9comment les changements sont effectivement annulés). Nous allons nous intéresser à ce dernier point.","","Il y a principalement deux façons d'annuler des changements avec Git -- l'une est `git reset` et l'autre est `git revert`. Nous allons maintenant voir chacune de ces façons",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","","`git reset` annule des changements en déplaçant la référence en arrière dans le temps sur un commit plus ancien. En ce sens, on peut considérer cela comme une façon de \"réécrire l'histoire\"; `git reset` fait remonter une branche en arrière comme si le(s) commit(s) n'avait jamais eu lieu.","","Regardons à quoi cela ressemble :"],afterMarkdowns:["Bravo ! Git a simplement déplacé la référence de la branche master en la faisant revenir sur `C1`; désormais notre dépôt est dans le même état que si `C2` n'avait jamais eu lieu"],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","Bien que le reset marche parfaitement pour les branches locales sur notre propre machine, cette façon de \"réécrire l'histoire\" ne marche pas avec les banches distantes (remote) que d'autres personnes utilisent.","","Pour pouvoir annuler des changements et *partager* ces annulations avec d'autres, nous devons utiliser `git revert`. Regardons comment cela fonctionne"],afterMarkdowns:["Étrangement, un nouveau commit est appaaru en bas sous le commit que nous voulions annuler. C'est parce que ce nouveau commit `C2'` introduit des *modifications* -- celles qui correspondent justement à l'annulation de celles du commit `C2`.","","Avec revert, vous pouvez diffuser (push) vos modifications et les partager avec tout le monde."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Pour accomplir ce niveau, annulez les deux derniers commits à la fois sur `local` et sur `pushed`.","","Ayez à l'esprit que `pushed` est une branche distante et `local` est une branche locale -- cela devrait vous guider dans le choix de la méthode à employer."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git ",""," Git reverse commit Git ",""," Git `git reset` `git revert`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` 退""`git reset` 退',"",""],command:"git reset HEAD~1",afterMarkdowns:["Nice! Git master `C1` `C2` "],beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","便","","** `git revert`"],command:"git revert HEAD",afterMarkdowns:[" `C2'` **introduces changes `C2` ",""," revert"],beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:[" `local` `pushed` ",""," `pushes` `local` "]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git ","","Git . ( ) ( ) , .","","Git -- `git reset` , `git revert` . .",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git (reset)","",'`git reset` . " " . , `git reset` .',""," :"],afterMarkdowns:[" master `C1` ; `C2` ."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git (revert)","",' (reset) , " " .',""," , ** , `git revert` . ."],afterMarkdowns:[", . `C2` ** , `C2` .",""," (push) ."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:[" , `local` `pushed` .","","`pushed` , `local` -- ?"]}}]}}}}),e("/src/levels/rampup/reversingChanges.js"),e.define("/src/levels/rebase/manyRebases.js",function(e,t,n,r,i,s,o){n.level={compareOnlyMasterHashAgnostic:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22bugFix%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C6%27%22%2C%22id%22%3A%22side%22%7D%2C%22another%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22another%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C7%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C7%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%2C%22C7%27%22%3A%7B%22parents%22%3A%5B%22C6%27%22%5D%2C%22id%22%3A%22C7%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout bugFix;git rebase master;git checkout side;git rebase bugFix;git checkout another;git rebase side;git rebase another master",startTree:'{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C3","id":"bugFix"},"side":{"target":"C6","id":"side"},"another":{"target":"C7","id":"another"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C0"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C5"],"id":"C7"}},"HEAD":{"target":"master","id":"HEAD"}}',name:{ko:"9 ",en_US:"Rebasing over 9000 times",zh_CN:""},hint:{en_US:"Remember, the most efficient way might be to only update master at the end...",ko:" master ...",zh_CN:"master"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebasing Multiple Branches","","Man, we have a lot of branches going on here! Let's rebase all the work from these branches onto master.","","Upper management is making this a bit trickier though -- they want the commits to all be in sequential order. So this means that our final tree should have `C7'` at the bottom, `C6'` above that, etc etc, etc all in order.","","If you mess up along the way, feel free to use `reset` to start over again. Be sure to check out our solution and see if you can do it in fewer commands!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["### ",""," master ","","upper management `C7'` `C6'` ",""," `reset` "]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["### (rebase) ","",", ! master ?",""," -- . `C7'` , `C6'` , .",""," , `reset` . , !"]}}]}}}}),e("/src/levels/rebase/manyRebases.js"),e.define("/src/levels/rebase/selectiveRebase.js",function(e,t,n,r,i,s,o){n.level={compareAllBranchesHashAgnostic:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C5%22%2C%22id%22%3A%22master%22%7D%2C%22one%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22one%22%7D%2C%22two%22%3A%7B%22target%22%3A%22C2%27%27%22%2C%22id%22%3A%22two%22%7D%2C%22three%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22three%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C4%27%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C4%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C4%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22two%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout one; git cherry-pick C4 C3 C2; git checkout two; git cherry-pick C5 C4 C3 C2; git branch -f three C2",startTree:'{"branches":{"master":{"target":"C5","id":"master"},"one":{"target":"C1","id":"one"},"two":{"target":"C1","id":"two"},"three":{"target":"C1","id":"three"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"}},"HEAD":{"target":"master","id":"HEAD"}}',name:{ko:" ",en_US:"Branch Spaghetti",zh_CN:""},hint:{en_US:"Make sure to do everything in the proper order! Branch one first, then two, then three",ko:" ! (cherry-pick) , (rebase -i) ",zh_CN:" `one`, `two`, `three`"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch Spaghetti","","WOAHHHhhh Nelly! We have quite the goal to reach in this level.","","Here we have `master` that is a few commits ahead of branches `one` `two` and `three`. For whatever reason, we need to update these three other branches with modified versions of the last few commits on master.","","Branch `one` needs a re-ordering and a deletion of `C5`. `two` needs pure reordering, and `three` only needs one commit!","","We will let you figure out how to solve this one -- make sure to check out our solution afterwards with `show solution`. "]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch Spaghetti","","",""," `master` `one` `two` `three` master update these three other brances with modified versions of the last few commits on master",""," `one` `two` `three` ",""," `show solution` "]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## ","",", !",""," `master` `one`, `two`,`three` 3 . , master .","","`one` `C5` , `two` , `three` !",""," `show solution` ."]}}]}}}}),e("/src/levels/rebase/selectiveRebase.js")})();