diff --git a/.gitignore b/.gitignore index f274b4d7..2075e1c8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,10 @@ -# NPM +# NPM and Yarn npm-debug.log +yarn-error.log node_modules/ # Build artifacts and asset stuff build/* -build/bundle.js -build/bundle.*.js -build/main.*.css screens FontAwesome-Vectors.pdf index.html @@ -14,6 +12,9 @@ index.html # Vim swaps *.sw* +# sed backups +*.bak + # Annoying mac stuff .DS_STORE @@ -22,7 +23,6 @@ index.html *.xcworkspace xcuserdata UserInterfaceState.xcuserstate -xcuserdata/ *.pbxuser *.perspective @@ -40,7 +40,6 @@ xcuserdata/ .User.xcconfig -xcuserdata Tools/xctool/build Tools/clang/analyzer/build Tools/clang/libtooling/build @@ -50,7 +49,3 @@ VendorLib/Breakpad/src/tools/mac/dump_syms/build DerivedData VendorLib/clang/lib/arc VendorLib/clang/lib/c++ - -*.swp - - diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 00000000..7e9d9b83 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,9 @@ +ports: +- port: 8000 + onOpen: open-preview +tasks: +- init: yarn install + command: > + yarn gulp fastBuild && + printf "\nWelcome to Learn Git Branching\nTo rebuild the app, simply run 'yarn gulp fastBuild' and reload index.html.\n\n" && + python3 -m http.server 8000 2>/dev/null diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 00000000..94ef1d9a --- /dev/null +++ b/.jshintrc @@ -0,0 +1,41 @@ +{ + "esversion": 6, + "curly": true, + "eqeqeq": false, + "regexp": false, + "nonew": false, + "latedef": false, + "forin": false, + "globalstrict": false, + "node": true, + "immed": true, + "newcap": true, + "noarg": true, + "bitwise": true, + "sub": true, + "undef": true, + "unused": true, + "trailing": true, + "devel": true, + "jquery": true, + "nonstandard": true, + "boss": true, + "eqnull": true, + "browser": true, + "debug": true, + "globals": { + "casper": true, + "Raphael": true, + "require": true, + "console": true, + "describe": true, + "expect": true, + "it": true, + "runs": true, + "waitsFor": true, + "exports": true, + "module": true, + "prompt": true, + "process": true + } +} diff --git a/.travis.yml b/.travis.yml index 89b60a3b..3b6b4d6f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,16 @@ +sudo: false language: node_js node_js: - - "4.1" - - "5.3" + - "10" + - "8" +before_install: + - curl -o- -L https://yarnpkg.com/install.sh | bash + - export PATH="$HOME/.yarn/bin:$PATH" +cache: + yarn: true + directories: + - "node_modules" +script: + - ./checkgit.sh "Source files were modified before build; is yarn.lock out of sync with package.json?" || travis_terminate $? + - yarn gulp + - ./checkgit.sh "Source files were modified by the build" || travis_terminate $? diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 13e7f6b8..00000000 --- a/Gruntfile.js +++ /dev/null @@ -1,256 +0,0 @@ -var _ = require('underscore'); -var fs = require('fs'); - -// Haha, this is so tricky. so we have a template for index.html to stick -// in the hashed JS and style files -- that template also contains -// templates used in the app. in order to avoid evaluating those -// templates, we change the regexes so we can effectively nest templates -_.templateSettings.interpolate = /\{\{(.+?)\}\}/g; -_.templateSettings.escape = /\{\{\{(.*?)\}\}\}/g; -_.templateSettings.evaluate = /\{\{-(.*?)\}\}/g; - -// precompile for speed -var indexFile = fs.readFileSync('src/template.index.html').toString(); -var indexTemplate = _.template(indexFile); - -/** - * This is SUPER jank but I cant get the underscore templating to evaluate - * correctly with custom regexes, so I'm just going to use interpolate - * and define the strings here. - */ - -var prodDependencies = [ - '', - '', - '', - '' -]; - -var devDependencies = [ - '', - '', - '', - '' -]; - -/*global module:false*/ -module.exports = function(grunt) { - // eventually have sound...? - grunt.registerTask('compliment', 'Stay motivated!', function() { - var compliments = grunt.config('compliment.compliments'); - var index = Math.floor(Math.random() * compliments.length); - - grunt.log.writeln(compliments[index]); - }); - - grunt.registerTask('lintStrings', 'Find if an INTL string doesnt exist', function() { - var child_process = require('child_process'); - child_process.exec('node src/js/intl/checkStrings', function(err, output) { - grunt.log.writeln(output); - }); - }); - - var buildIndex = function(config) { - grunt.log.writeln('Building index...'); - - // first find the one in here that we want - var buildFiles = fs.readdirSync('build'); - - var hashedMinFile; - if (buildFiles.length == 2) { - grunt.log.writeln('Assuming debug mode wanted'); - hashedMinFile = 'bundle.js'; - } - var jsRegex = /bundle\.min\.\w+\.js/; - _.each(buildFiles, function(jsFile) { - if (jsRegex.test(jsFile)) { - if (hashedMinFile) { - throw new Error('more than one hashed file: ' + jsFile + hashedMinFile); - } - hashedMinFile = jsFile; - } - }); - if (!hashedMinFile) { throw new Error('no hashed min file found!'); } - - grunt.log.writeln('Found hashed js file: ' + hashedMinFile); - - var styleRegex = /main\.\w+\.css/; - var hashedStyleFile; - _.each(buildFiles, function(styleFile) { - if (styleRegex.test(styleFile)) { - if (hashedStyleFile) { - throw new Error('more than one hashed style: ' + styleFile + hashedStyleFile); - } - hashedStyleFile = styleFile; - } - }); - if (!hashedStyleFile) { throw new Error('no style found'); } - - grunt.log.writeln('Found hashed style file: ' + hashedStyleFile); - - // output these filenames to our index template - var outputIndex = indexTemplate({ - jsFile: hashedMinFile, - styleFile: hashedStyleFile, - jsDependencies: config.isProd ? - prodDependencies.join("\n") : - devDependencies.join("\n") - }); - fs.writeFileSync('index.html', outputIndex); - }; - - grunt.registerTask('buildIndex', 'stick in hashed resources', buildIndex.bind(null, {isProd: true})); - grunt.registerTask('buildIndexDev', 'stick in hashed resources', buildIndex.bind(null, {isProd: false})); - - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - jshint: { - all: [ - 'Gruntfile.js', - '__tests__/*.spec.js', - 'src/js/**/*.js', - 'src/js/**/**/*.js', - 'src/levels/**/*.js' - ], - options: { - ignores: [ - 'src/js/**/*.ios.js', - 'src/js/native_react_views/*.js' - ], - curly: true, - // sometimes triple equality is just redundant and unnecessary - eqeqeq: false, - // i know my regular expressions - regexp: false, - // i think it's super weird to not use new on a constructor - nonew: false, - // these latedefs are just annoying -- no pollution of global scope - latedef: false, - // use this in mocks - forin: false, - // This gets annoying - globalstrict: false, - // for use strict warnings - node: true, - /////////////////////////////// - // All others are true - ////////////////////////////// - immed: true, - newcap: true, - noarg: true, - bitwise: true, - sub: true, - undef: true, - unused: false, - trailing: true, - devel: true, - jquery: true, - nonstandard: true, - boss: true, - eqnull: true, - browser: true, - debug: true, - reporterOutput: '', - globals: { - casper: true, - Raphael: true, - require: true, - console: true, - describe: true, - expect: true, - it: true, - runs: true, - waitsFor: true, - exports: true, - module: true, - prompt: true, - process: true - } - }, - }, - compliment: { - compliments: [ - "Wow peter great work!", - "Such a professional dev environment", - "Can't stop the TRAIN", - "git raging" - ] - }, - hash: { - options: { - mapping: '' - }, - js: { - src: 'build/bundle.min.js', - dest: 'build/' - }, - css: { - src: 'src/style/main.css', - dest: 'build/' - } - }, - watch: { - files: '', - tasks: 'watching' - }, - uglify: { - build: { - src: ['build/bundle.js'], - dest: 'build/bundle.min.js' - } - }, - clean: ['build/*'], - shell: { - gitAdd: { - command: 'git add build/' - } - }, - jasmine_node: { - projectRoot: './__tests__/', - forceExit: true, - verbose: true, - requirejs: false - }, - env: { - prod: { - NODE_ENV: 'production', - }, - }, - browserify: { - options: { - transform: [require('grunt-react').browserify] - }, - dist: { - files: { - 'build/bundle.js': [ - 'src/**/*.js', - 'src/**/*.jsx' - ] - } - } - } - }); - - // all my npm helpers - grunt.loadNpmTasks('grunt-jsxhint'); - grunt.loadNpmTasks('grunt-browserify'); - grunt.loadNpmTasks('grunt-hash'); - grunt.loadNpmTasks('grunt-contrib-clean'); - grunt.loadNpmTasks('grunt-shell-spawn'); - grunt.loadNpmTasks('grunt-jasmine-node'); - grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-react'); - grunt.loadNpmTasks('grunt-env'); - - grunt.registerTask('build', - ['clean', 'env', 'browserify', 'uglify', 'hash', 'buildIndex', 'shell:gitAdd', 'jasmine_node', 'jshint', 'lintStrings', 'compliment'] - ); - grunt.registerTask('lint', ['jshint', 'compliment']); - grunt.registerTask('fastBuild', ['clean', 'browserify', 'hash', 'buildIndexDev', 'jshint']); - grunt.registerTask('watching', ['fastBuild', 'jasmine_node', 'jshint', 'lintStrings']); - - grunt.registerTask('default', ['build']); - grunt.registerTask('test', ['jasmine_node']); - grunt.registerTask('casperTest', ['shell:casperTest']); -}; - diff --git a/README.md b/README.md index b19d022b..38a4dd3b 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ # LearnGitBranching [](https://travis-ci.org/pcottle/learnGitBranching) +[](https://github.com/pcottle/learnGitBranching/pulls) -LearnGitBranching is a git repository visualizer, sandbox, and series of educational tutorials and challenges. Its primary purpose is to help developers understand git through the power of visualization (something that's absent when working on the command line). +LearnGitBranching is a git repository visualizer, sandbox, and a series of educational tutorials and challenges. Its primary purpose is to help developers understand git through the power of visualization (something that's absent when working on the command line). This is achieved through a game with different levels to get acquainted with the different git commands. You can input a variety of commands into LearnGitBranching (LGB) -- as commands are processed, the nearby commit tree will dynamically update to reflect the effects of each command: @@ -11,7 +12,7 @@ You can input a variety of commands into LearnGitBranching (LGB) -- as commands This visualization combined with tutorials and "levels" can help both beginners and intermediate developers polish their version control skills. A quick demo is available here: https://pcottle.github.com/learnGitBranching/?demo -Or you can launch the application normally here: +Or, you can launch the application normally here: https://pcottle.github.com/learnGitBranching/ ### Sandbox Mode @@ -69,34 +70,73 @@ Thus, if you build the app locally, all you have to do in order to run the app i ## Building yourself / Contributing Functionality For contributing core functionality in the app, you'll probably want to test your changes -at least once before submitting a pull request. That means you'll need the "Grunt.js" build tool to build the app: +at least once before submitting a pull request. That means you'll need the "gulp.js" build tool to build the app: -https://gruntjs.com/getting-started +https://gulpjs.com/docs/en/getting-started/quick-start -You'll also need `npm` to download all the dependencies of the project. +You'll also need `yarn` to download all the dependencies of the project. The general workflow / steps are below: -``` +```bash git clone cd learnGitBranching -npm install # to install all the node modules I depend on +yarn install git checkout -b newAwesomeFeature vim ./src/js/git/index.js # some changes -grunt fastBuild # skips tests and linting, faster build +yarn gulp fastBuild # skips tests and linting, faster build # after building you can open up your browser to the index.html # file generated and see your changes vim ./src/js/git/index.js # more changes -grunt build # runs tests and lint +yarn gulp build # runs tests and lint git commit -am "My new sweet feature!" git push # go online and request a pull ``` +Alternatively, you can also build and run the app in a pre-configured online workspace: + +[](https://gitpod.io/#https://github.com/pcottle/learnGitBranching/blob/master/src/js/git/index.js) + +[//]: contributor-faces + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[//]: contributor-faces + ## Helpful Folks A big shoutout to these brave souls for extensively testing our sandbox and finding bugs and/or inconsistencies: @@ -122,7 +162,9 @@ And the following heroes for assisting in translating: * Vasil Kulakov ("coyl") & Lyubov Agadjanyan ("shayenblue") * Aliaksei Berkau ("alexeiberkov") * Mizunashi Mana ("mizunashi-mana") +* Olsza Also huge shoutout for everyone who has put up a pull request that was pulled! Check out the 30+ contributors we have in the [Contributors View](https://github.com/pcottle/learnGitBranching/graphs/contributors) And everyone who has reported an issue that was successfully closed! + diff --git a/__tests__/base.js b/__tests__/base.js index a8d5ab32..dc0fc848 100644 --- a/__tests__/base.js +++ b/__tests__/base.js @@ -1,3 +1,5 @@ +var Q = require('q'); + var HeadlessGit = require('../src/js/git/headless').HeadlessGit; var TreeCompare = require('../src/js/graph/treeCompare.js'); @@ -26,65 +28,27 @@ var getHeadlessSummary = function(headless) { var expectLevelAsync = function(headless, levelBlob) { var command = levelBlob.solutionCommand; if (command.indexOf('git rebase -i') !== -1) { - // dont do interactive rebase levels + // don't do interactive rebase levels return; } - var hasWarned = false; - var start; - runs(function() { - start = Date.now(); - headless.sendCommand(command); + return headless.sendCommand(command).then(function() { + expect(compareLevelTree(headless, levelBlob)).toBeTruthy( + 'Level "' + levelBlob['name']['en_US'] + '" should get solved' + ); }); - waitsFor(function() { - var diff = (Date.now() - start); - if (diff > TIME - 10 && !hasWarned) { - hasWarned = true; - console.log('this goal tree', loadTree(levelBlob.goalTreeString)); - console.log('not going to match with command', command); - console.log(getHeadlessSummary(headless)); - } - var result = compareLevelTree(headless, levelBlob); - if (result) { - console.log('solved level ' + levelBlob.name.en_US); - } - return result; - }, 'trees should be equal', TIME); }; var expectTreeAsync = function(command, expectedJSON, startJSON) { var headless = new HeadlessGit(); - var start = Date.now(); - var haveReported = false; if (startJSON) { headless.gitEngine.loadTreeFromString(startJSON); } - runs(function() { - headless.sendCommand(command); + return headless.sendCommand(command).then(function() { + expect(compareAnswer(headless, expectedJSON)).toBeTruthy(); }); - waitsFor(function() { - var diff = (Date.now() - start); - if (diff > TIME - 40 && !haveReported) { - haveReported = true; - var expected = loadTree(expectedJSON); - console.log('not going to match', command); - console.log('expected\n>>>>>>>>\n', expected); - console.log('\n<<<<<<<<<<<\nactual', getHeadlessSummary(headless)); - console.log('\n<<<>>>>\n'); - if (expected.originTree) { - console.log('expected origin tree:'); - console.log(expected.originTree); - console.log('\n=========\n'); - console.log('actual origin tree'); - console.log(getHeadlessSummary(headless).originTree); - } - console.log(expectedJSON); - console.log(JSON.stringify(getHeadlessSummary(headless))); - } - return compareAnswer(headless, expectedJSON); - }, 'trees should be equal', 500); }; var expectLevelSolved = function(levelBlob) { @@ -95,6 +59,19 @@ var expectLevelSolved = function(levelBlob) { expectLevelAsync(headless, levelBlob); }; +var runCommand = function(command, resultHandler) { + var headless = new HeadlessGit(); + var deferred = Q.defer(); + var msg = null; + + return headless.sendCommand(command, deferred).then(function() { + return deferred.promise.then(function(commands) { + msg = commands[commands.length - 1].get('error').get('msg'); + resultHandler(msg); + }); + }); +}; + var TIME = 150; // useful for throwing garbage and then expecting one commit var ONE_COMMIT_TREE = '{"branches":{"master":{"target":"C2","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}'; @@ -105,6 +82,6 @@ module.exports = { TIME: TIME, expectTreeAsync: expectTreeAsync, expectLevelSolved: expectLevelSolved, - ONE_COMMIT_TREE: ONE_COMMIT_TREE + ONE_COMMIT_TREE: ONE_COMMIT_TREE, + runCommand: runCommand }; - diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index 25f55f96..cfe6317d 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -1,279 +1,426 @@ +var intl = require('../src/js/intl') var base = require('./base'); var expectTreeAsync = base.expectTreeAsync; +var runCommand = base.runCommand; describe('Git', function() { it('Commits', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit', base.ONE_COMMIT_TREE ); }); it('handles commit options', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit; git commit --amend;', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22master%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%22C2%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('throws with bad arg options', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit foo; git commit -am -m; git commit -am -a; git commit -am "hi" "ho"; git commit', base.ONE_COMMIT_TREE ); }); it('handles lower case branch options', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch banana c0; git commit; git checkout -b side banana; git branch -d banana;git branch -f another c1; git commit', '{"branches":{"master":{"target":"C2","id":"master"},"side":{"target":"C3","id":"side"},"another":{"target":"C1","id":"another"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C0"],"id":"C3"}},"HEAD":{"target":"side","id":"HEAD"}}' ); }); it('handles branch options', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch banana C0; git commit; git checkout -b side banana; git branch -d banana;git branch -f another C1; git commit', '{"branches":{"master":{"target":"C2","id":"master"},"side":{"target":"C3","id":"side"},"another":{"target":"C1","id":"another"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C0"],"id":"C3"}},"HEAD":{"target":"side","id":"HEAD"}}' ); }); it('does add', function() { - expectTreeAsync( + return expectTreeAsync( 'git add; git commit', base.ONE_COMMIT_TREE ); }); it('resets with all options', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit;git reset --soft HEAD~1;git reset --hard HEAD~1;gc;go C1;git reset --hard C3;', '{"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":["C1"],"id":"C3"}},"HEAD":{"target":"C1","id":"HEAD"}}' ); }); it('Checkouts', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b side', '{"branches":{"master":{"target":"C1","id":"master"},"side":{"target":"C1","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"side","id":"HEAD"}}' ); }); + it('Switches', function() { + return expectTreeAsync( + 'git switch -c side', + '{"branches":{"master":{"target":"C1","id":"master"},"side":{"target":"C1","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"side","id":"HEAD"}}' + ); + }); + it('Rebases', function() { - expectTreeAsync( + return expectTreeAsync( 'gc; git checkout -b side C1; gc; git rebase master', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22side%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%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22side%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('Interactive rebase', function() { - expectTreeAsync( + return expectTreeAsync( 'gc; git checkout -b side C1; gc; git rebase -i master --interactive-test', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22side%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%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22side%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('Interactive rebases with commit re-ordering', function() { - expectTreeAsync( - 'gc;gc;git rebase -i C0 --interactive-test C3,C1', + return expectTreeAsync( + 'gc;gc;git rebase -i C0 --interactive-test C3,C1', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%27%22%2C%22id%22%3A%22master%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%22C0%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C1%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C1%27%22%7D%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22id%22%3A%22HEAD%22%2C%22target%22%3A%22master%22%7D%7D' - ); - }); + ); + }); it('Switch branch and execute interactive rebase', function() { - expectTreeAsync( - 'git branch test;git rebase -i C0 test --interactive-test', + return expectTreeAsync( + 'git branch test;git rebase -i C0 test --interactive-test', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%7D%2C%22test%22%3A%7B%22target%22%3A%22C1%27%22%2C%22id%22%3A%22test%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%22C1%27%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%27%22%7D%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22id%22%3A%22HEAD%22%2C%22target%22%3A%22test%22%7D%7D' - ); - }); + ); + }); it('Reverts', function() { - expectTreeAsync( + return expectTreeAsync( 'git revert HEAD', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%27%22%2C%22id%22%3A%22master%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%22C1%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C1%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('Merges', function() { - expectTreeAsync( + return expectTreeAsync( 'gc; git checkout -b side C1; gc; git merge master', '{"branches":{"master":{"target":"C2","id":"master"},"side":{"target":"C4","id":"side"}},"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","C3"],"id":"C4"}},"HEAD":{"target":"side","id":"HEAD"}}' ); }); it('Resets', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit; git reset HEAD~1', '{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}' ); }); it('Branches', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch side C0', '{"branches":{"master":{"target":"C1","id":"master"},"side":{"target":"C0","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}' ); }); it('Branches lowercase', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch side c0', '{"branches":{"master":{"target":"C1","id":"master"},"side":{"target":"C0","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}' ); }); it('Deletes branches', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch side; git branch -d side', '{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}' ); }); - it('Ammends commits', function() { - expectTreeAsync( + it('Amends commits', function() { + return expectTreeAsync( 'git commit --amend', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%27%22%2C%22id%22%3A%22master%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%22C1%27%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('Cherry picks', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b side C0; gc; git cherry-pick C11; git cherry-pick C1', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C1%27%22%2C%22id%22%3A%22side%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%22C0%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C1%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C1%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22side%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); + it('Range operator is not supported', function() { + return expectTreeAsync( + 'git checkout -b side C0; git cherry-pick C1..C0', + '{"branches":{"master":{"target": "C1","id": "master"},"side":{"target":"C0","id": "side"}},"commits":{"C0":{"parents":[],"id": "C0","rootCommit": true},"C1":{"parents":["C0"],"id": "C1"}},"HEAD":{"id": "HEAD","target":"side"}}' + ); + }); + it('Forces branches', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b side; git branch -f side C0', '{"branches":{"master":{"target":"C1","id":"master"},"side":{"target":"C0","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"side","id":"HEAD"}}' ); }); it('Rebases only new commits to destination', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b side C0; gc; gc;git cherry-pick C1;git rebase master', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22side%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%22C0%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%22C1%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C1%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22side%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('checks out after a rebase', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit; git checkout -b bugFix C1; git commit; git rebase master;git checkout master', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%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%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%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%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' ); }); + it('switches after a rebase ', function() { + return expectTreeAsync( + 'git commit; git switch -c bugFix C1; git commit; git rebase master;git switch master', + '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%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%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%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%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' + ); + }); + it('checks out after an interactive rebase', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit; git checkout -b bugFix C1; git commit; git rebase -i master --interactive-test;git checkout master', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%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%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%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%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' ); }); it('solves merging level', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b bugFix;git commit;git checkout master;git commit;git merge bugFix', - '{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}' + '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C4%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22bugFix%22%2C%22remoteTrackingBranchID%22%3Anull%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%22C2%22%2C%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('solves rebase level', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b bugFix;git commit;git checkout master;git commit;git checkout bugFix;git rebase master', - '{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}' + '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22bugFix%22%2C%22remoteTrackingBranchID%22%3Anull%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%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22bugFix%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('solves rebase level with interactive rebase', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b bugFix;git commit;git checkout master;git commit;git checkout bugFix;git rebase -i master --interactive-test', - '{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}' + '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22bugFix%22%2C%22remoteTrackingBranchID%22%3Anull%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%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22bugFix%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('does a whole bunch of crazy merging', function() { - expectTreeAsync( + return expectTreeAsync( 'gc;go -b side C1;gc;git merge master;go -b bug master;gc;go -b wut C3;git rebase bug;go side;git rebase wut;gc;git rebase wut;git merge C4;go master;git rebase side;go C6;git merge C3\';gb -f wut C8;go bug;git rebase wut', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C7%22%2C%22id%22%3A%22master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C7%22%2C%22id%22%3A%22side%22%7D%2C%22bug%22%3A%7B%22target%22%3A%22C8%22%2C%22id%22%3A%22bug%22%7D%2C%22wut%22%3A%7B%22target%22%3A%22C8%22%2C%22id%22%3A%22wut%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%22C2%22%2C%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%2C%22C7%22%3A%7B%22parents%22%3A%5B%22C4%22%2C%22C6%27%22%5D%2C%22id%22%3A%22C7%22%7D%2C%22C8%22%3A%7B%22parents%22%3A%5B%22C3%27%22%2C%22C6%22%5D%2C%22id%22%3A%22C8%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22bug%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('if no-ff is specified, will always make a merge commit', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit; go -b side HEAD~1; git commit; git merge master; go master; git merge side --no-ff', '{"branches":{"master":{"target":"C5","id":"master","remoteTrackingBranchID":null},"side":{"target":"C4","id":"side","remoteTrackingBranchID":null}},"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","C3"],"id":"C4"},"C5":{"parents":["C2","C4"],"id":"C5"}},"HEAD":{"target":"master","id":"HEAD"}}' ); }); - it('makes a tag', function() { - expectTreeAsync( - 'git tag v1', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"v1":{"target":"C1","id":"v1","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('makes a tag', function() { + return expectTreeAsync( + 'git tag v1', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"v1":{"target":"C1","id":"v1","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); - it('makes a tag on another ref', function() { - expectTreeAsync( - 'git tag v1 C0', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"v1":{"target":"C0","id":"v1","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('makes a tag and removes a tag', function() { + return expectTreeAsync( + 'git tag v1; git tag -d v1', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); - it('doesnt make a tag if ref doesnt resolve', function() { - expectTreeAsync( - 'git tag v1 foo', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('makes a tag on another ref', function() { + return expectTreeAsync( + 'git tag v1 C0', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"v1":{"target":"C0","id":"v1","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); - it('makes tag with relative ref and etc', function() { - expectTreeAsync( - 'git tag v1 HEAD~1', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"v1":{"target":"C0","id":"v1","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('doesn\'t make a tag if ref doesn\'t resolve', function() { + return expectTreeAsync( + 'git tag v1 foo', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); - it('makes tag with 3 letters', function() { - expectTreeAsync( - 'git tag foo', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"foo":{"target":"C1","id":"foo","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('makes tag with relative ref and etc', function() { + return expectTreeAsync( + 'git tag v1 HEAD~1', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"v1":{"target":"C0","id":"v1","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); - it('does not make tag if ref does not resolve', function() { - expectTreeAsync( - 'git tag foo banana', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('makes tag with 3 letters', function() { + return expectTreeAsync( + 'git tag foo', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"foo":{"target":"C1","id":"foo","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); - it('should respect second command for -B option', function() { - expectTreeAsync( - 'git commit; git checkout -B side C1', - '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"side":{"target":"C1","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"side","id":"HEAD"}}' - ); - }); + it('does not make tag if ref does not resolve', function() { + return expectTreeAsync( + 'git tag foo banana', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); - it('will throw error if bad commits given to interactive test', function() { - expectTreeAsync( - 'gc; git rebase HEAD~2 -i --interactive-test C2,C100; gc', - '{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('should respect second command for -B option', function() { + return expectTreeAsync( + 'git commit; git checkout -B side C1', + '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"side":{"target":"C1","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"side","id":"HEAD"}}' + ); + }); - it('can handle slashes and dashes in branch names but doesnt allow o/', function() { - expectTreeAsync( + it('will throw error if bad commits given to interactive test', function() { + return expectTreeAsync( + 'gc; git rebase HEAD~2 -i --interactive-test C2,C100; gc', + '{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); + + it('can handle slashes and dashes in branch names but doesn\'t allow o/', function() { + return expectTreeAsync( 'git branch foo/bar; git commit; git checkout foo/bar; gc; go master; git merge foo/bar; go foo/bar; git checkout -b bar-baz; git commit; git branch o/foo', '{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":null},"foo/bar":{"target":"C3","id":"foo/bar","remoteTrackingBranchID":null},"bar-baz":{"target":"C5","id":"bar-baz","remoteTrackingBranchID":null}},"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","C3"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"}},"tags":{},"HEAD":{"target":"bar-baz","id":"HEAD"}}' - ); + ); }); it('the regex allows for multiple dashes but not in a row', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch foo-bar-banana-baz; gc; git branch foo----bar//baz', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"foo-bar-b":{"target":"C1","id":"foo-bar-b","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' - ); + ); }); -}); + describe('RevList', function() { + it('requires at least 1 argument', function() { + return runCommand('git rev-list', function(commandMsg) { + expect(commandMsg).toEqual(intl.str( + 'git-error-args-few', + { + lower: 1, + what: 'with git rev-list' + } + )); + }); + }); + + describe('supports', function() { + var SETUP = 'git co -b left C0; gc; git merge master; git co -b right C0; gc; git merge master; git co -b all left; git merge right; '; + + it('single included revision', function() { + return runCommand(SETUP + 'git rev-list all', function(commandMsg) { + expect(commandMsg).toBe('C6\nC5\nC4\nC3\nC2\nC1\nC0\n'); + }); + }); + + it('single excluded revision', function() { + return runCommand(SETUP + 'git rev-list all ^right', function(commandMsg) { + expect(commandMsg).toBe('C6\nC3\nC2\n'); + }); + }); + + it('multiple included revisions', function() { + return runCommand(SETUP + 'git rev-list right left', function(commandMsg) { + expect(commandMsg).toBe('C5\nC4\nC3\nC2\nC1\nC0\n'); + }); + }); + + it('multiple excluded revisions', function() { + return runCommand(SETUP + 'git rev-list all ^right ^left', function(commandMsg) { + expect(commandMsg).toBe('C6\n'); + }); + }); + + it('range between branches', function() { + return runCommand(SETUP + 'git rev-list left..right', function(commandMsg) { + expect(commandMsg).toBe('C5\nC4\n'); + }); + }); + + it('range between commits', function() { + return runCommand(SETUP + 'git rev-list C3..C5', function(commandMsg) { + expect(commandMsg).toBe('C5\nC4\n'); + }); + }); + }); + }); + + describe('Log supports', function() { + var SETUP = 'git co -b left C0; gc; git merge master; git co -b right C0; gc; git merge master; git co -b all left; git merge right; '; + + it('implied HEAD', function() { + return runCommand(SETUP + '; git co right; git log', function(commandMsg) { + expect(commandMsg).toContain('Commit: C0\n'); + expect(commandMsg).toContain('Commit: C1\n'); + expect(commandMsg).not.toContain('Commit: C2\n'); + expect(commandMsg).not.toContain('Commit: C3\n'); + expect(commandMsg).toContain('Commit: C4\n'); + expect(commandMsg).toContain('Commit: C5\n'); + expect(commandMsg).not.toContain('Commit: C6\n'); + }); + }); + + it('single included revision', function() { + return runCommand(SETUP + 'git log right', function(commandMsg) { + expect(commandMsg).toContain('Commit: C0\n'); + expect(commandMsg).toContain('Commit: C1\n'); + expect(commandMsg).not.toContain('Commit: C2\n'); + expect(commandMsg).not.toContain('Commit: C3\n'); + expect(commandMsg).toContain('Commit: C4\n'); + expect(commandMsg).toContain('Commit: C5\n'); + expect(commandMsg).not.toContain('Commit: C6\n'); + }); + }); + + it('single excluded revision', function() { + return runCommand(SETUP + 'git log all ^right', function(commandMsg) { + expect(commandMsg).not.toContain('Commit: C0\n'); + expect(commandMsg).not.toContain('Commit: C1\n'); + expect(commandMsg).toContain('Commit: C2\n'); + expect(commandMsg).toContain('Commit: C3\n'); + expect(commandMsg).not.toContain('Commit: C4\n'); + expect(commandMsg).not.toContain('Commit: C5\n'); + expect(commandMsg).toContain('Commit: C6\n'); + }); + }); + + it('multiple included revisions', function() { + return runCommand(SETUP + 'git log right left', function(commandMsg) { + expect(commandMsg).toContain('Commit: C0\n'); + expect(commandMsg).toContain('Commit: C1\n'); + expect(commandMsg).toContain('Commit: C2\n'); + expect(commandMsg).toContain('Commit: C3\n'); + expect(commandMsg).toContain('Commit: C4\n'); + expect(commandMsg).toContain('Commit: C5\n'); + expect(commandMsg).not.toContain('Commit: C6\n'); + }); + }); + + it('multiple excluded revisions', function() { + return runCommand(SETUP + 'git log all ^right ^left', function(commandMsg) { + expect(commandMsg).not.toContain('Commit: C0\n'); + expect(commandMsg).not.toContain('Commit: C1\n'); + expect(commandMsg).not.toContain('Commit: C2\n'); + expect(commandMsg).not.toContain('Commit: C3\n'); + expect(commandMsg).not.toContain('Commit: C4\n'); + expect(commandMsg).not.toContain('Commit: C5\n'); + expect(commandMsg).toContain('Commit: C6\n'); + }); + }); + }); +}); diff --git a/__tests__/levels.spec.js b/__tests__/levels.spec.js index 8ee2e6fb..ee4bc5ab 100644 --- a/__tests__/levels.spec.js +++ b/__tests__/levels.spec.js @@ -1,16 +1,14 @@ var base = require('./base'); describe('GitEngine Levels', function() { - it('solves levels', function() { - var sequences = require('../src/levels/index').levelSequences; - Object.keys(sequences).forEach(function(sequenceKey) { - var levels = sequences[sequenceKey]; - Object.keys(levels).forEach(function(index) { - var levelBlob = levels[index]; - console.log('testing level', levelBlob.name.en_US); + var sequences = require('../src/levels/index').levelSequences; + Object.keys(sequences).forEach(function(sequenceKey) { + var levels = sequences[sequenceKey]; + Object.keys(levels).forEach(function(index) { + var levelBlob = levels[index]; + it('solves level ' + levelBlob['name']['en_US'] + ' in sequence ' + sequenceKey, function() { base.expectLevelSolved(levelBlob); - }.bind(this)); - }); + }); + }.bind(this)); }); }); - diff --git a/__tests__/mercurial.spec.js b/__tests__/mercurial.spec.js index d2f7eb4c..16b2e96e 100644 --- a/__tests__/mercurial.spec.js +++ b/__tests__/mercurial.spec.js @@ -4,7 +4,7 @@ var expectTreeAsync = base.expectTreeAsync; describe('Mercurial', function() { var assert = function(msg, command, tree) { it(msg, function() { - expectTreeAsync(command, tree); + return expectTreeAsync(command, tree); }); }; @@ -63,4 +63,3 @@ describe('Mercurial', function() { ); }); - diff --git a/__tests__/remote.spec.js b/__tests__/remote.spec.js index 9f5f51e6..96092f8a 100644 --- a/__tests__/remote.spec.js +++ b/__tests__/remote.spec.js @@ -3,280 +3,280 @@ var expectTreeAsync = base.expectTreeAsync; describe('Git Remotes', function() { it('clones', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('does fake teamwork', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git fakeTeamwork', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('does fake teamwork and then fetches', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git fakeTeamwork; git fetch', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git fakeTeamwork; git pull', '{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C3","id":"o/master","remoteTrackingBranchID":null}},"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","C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls with rebase', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git fakeTeamwork; git pull --rebase', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3A%22o/master%22%2C%22localBranchesThatTrackThis%22%3Anull%7D%2C%22o/master%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22o/master%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3A%5B%22master%22%5D%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%22master%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%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%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D' ); }); it('pushes', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git push', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls and then pushes', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git fakeTeamwork; git pull; git push', '{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C4","id":"o/master","remoteTrackingBranchID":null}},"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","C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls with rebase and then pushes', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git fakeTeamwork; git pull --rebase; git push', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3A%22o/master%22%2C%22localBranchesThatTrackThis%22%3Anull%7D%2C%22o/master%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22o/master%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3A%5B%22master%22%5D%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%22master%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%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%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%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D' ); }); it('clones with many branches', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch bugFix; git clone', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"bugFix":{"target":"C1","id":"bugFix","remoteTrackingBranchID":"o/bugFix"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/bugFix":{"target":"C1","id":"o/bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"bugFix":{"target":"C1","id":"bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('clones with a merge commit, does teamwork, fetches', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch bugFix; git commit; git checkout bugFix; git commit; git merge master; git clone; git fakeTeamwork bugFix 2', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"bugFix":{"target":"C4","id":"bugFix","remoteTrackingBranchID":"o/bugFix"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null},"o/bugFix":{"target":"C4","id":"o/bugFix","remoteTrackingBranchID":null}},"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","C3"],"id":"C4"}},"HEAD":{"target":"bugFix","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"bugFix":{"target":"C6","id":"bugFix","remoteTrackingBranchID":null}},"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","C3"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"bugFix","id":"HEAD"}}}' ); }); it('only fetches one branch if specified', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch bugFix; git clone; git fakeTeamwork bugFix; git fakeTeamwork; git fetch origin bugFix', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"bugFix":{"target":"C1","id":"bugFix","remoteTrackingBranchID":"o/bugFix"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/bugFix":{"target":"C2","id":"o/bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":null},"bugFix":{"target":"C2","id":"bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('checks all branches for fetching', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch bugFix; git clone; git fakeTeamwork; git fetch', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"bugFix":{"target":"C1","id":"bugFix","remoteTrackingBranchID":"o/bugFix"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null},"o/bugFix":{"target":"C1","id":"o/bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"bugFix":{"target":"C1","id":"bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls with nothing and then commits', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git pull; git commit', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls from different remote tracking branches nad merges', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch side; git clone; git fakeTeamwork side;git commit; git pull origin side;git pull;git fakeTeamwork master;git pull', '{"branches":{"master":{"target":"C6","id":"master","remoteTrackingBranchID":"o/master"},"side":{"target":"C1","id":"side","remoteTrackingBranchID":"o/side"},"o/master":{"target":"C5","id":"o/master","remoteTrackingBranchID":null},"o/side":{"target":"C2","id":"o/side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C2","C3"],"id":"C4"},"C5":{"parents":["C1"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C5","id":"master","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C5":{"parents":["C1"],"id":"C5"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls with rebase from different remote tracking', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch side; git clone; git fakeTeamwork side;git commit; git pull origin side --rebase', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3A%22o/master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22side%22%2C%22remoteTrackingBranchID%22%3A%22o/side%22%7D%2C%22o/master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22o/master%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3A%5B%22master%22%5D%7D%2C%22o/side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22o/side%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3A%5B%22side%22%5D%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%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%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%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%2C%22side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22side%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%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%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22side%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D' ); }); it('pushes to another remote', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch side; git clone;git commit; git push origin HEAD:side', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"side":{"target":"C1","id":"side","remoteTrackingBranchID":"o/side"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/side":{"target":"C2","id":"o/side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pushes to tracking remote', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch side; git clone;git commit;git push; go side; git commit; git push', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"side":{"target":"C3","id":"side","remoteTrackingBranchID":"o/side"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null},"o/side":{"target":"C3","id":"o/side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"side","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"side":{"target":"C3","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('sets tracking when checking out remote branch', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git checkout -b side o/master;git fakeTeamwork;git pull', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["master","side"]},"side":{"target":"C2","id":"side","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"side","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('also sets tracking when just branching', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; gb side o/master', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["master","side"]},"side":{"target":"C1","id":"side","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('can push with colon refspec', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; gc; git checkout -b foo HEAD~1; git push origin master:master', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"foo","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('can delete branches with colon refspec', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch foo; git clone; git push origin :foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pushes new branch onto server', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git push origin master:foo', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C2","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('does not push for HEAD', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git checkout C2; git push', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"C2","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('does push for HEAD as a source though to a new branch', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git checkout C2; git push origin HEAD:foo', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C2","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"C2","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('but it cant delete master on remote', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch foo; git clone; git push origin :master', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":"o/foo"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('will prune the origin tree when deleting branches', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b foo; git commit; git clone; git push origin :foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":null},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"foo","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('will not push to a remote if the local ref does not exist', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git push origin foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('will push to the remote branch IF IT has tracking', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git checkout -b foo o/master; git commit; git push', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"foo","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('will push to a new remote branch if no tracking is set up', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git checkout -b foo; git commit; git push', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":"o/foo"},"o/foo":{"target":"C2","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"foo","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('will push to the remote tracking branch WHILE NOT on branch if it is set up', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git checkout -b foo o/master; git commit; go master; git push origin foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('will not fetch if ref does not exist on remote', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git fakeTeamwork; git fetch foo:master', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('does not fetch if ref does not exist on remote with one arg', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git fakeTeamwork; git fetch foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('validates branch names when fetching', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git fakeTeamwork; git fetch master:HEAD; git fetch master:f<>', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('fetches only one remote if specified', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone;gc;git push origin master:banana;git fakeTeamwork banana;git fakeTeamwork master;git fetch origin banana', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/banana":{"target":"C3","id":"o/banana","remoteTrackingBranchID":null}},"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"},"originTree":{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":null},"banana":{"target":"C3","id":"banana","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C1"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('sets remote tracking', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git branch foo; git branch -u o/master foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('sets remote tracking on current branch if not specified', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git checkout -b foo; git branch -u o/master', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"foo","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('fetches with no args, explicit dest args, and with just one arg', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git fakeTeamwork; git fetch origin master:o/master;git fakeTeamwork;git fetch;git fakeTeamwork;git fetch origin master', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C4","id":"o/master","remoteTrackingBranchID":null}},"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":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":null}},"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":"master","id":"HEAD"}}}' ); }); - it('doesnt fetch if out of sync, but will update explicit dest if specified', function() { - expectTreeAsync( + it('doesn\'t fetch if out of sync, but will update explicit dest if specified', function() { + return expectTreeAsync( 'git clone; git fakeTeamwork; go HEAD~1; git fetch origin master:master;go master; gc; go HEAD~1; git fakeTeamwork;git fetch origin master:master', '{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"C2","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C2"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls to the right branch and destination', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git checkout -b side o/master;git fakeTeamwork;git pull origin master:o/master', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"side","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('correctly checks upstream when pushing to a remote where commits already exist but branch is not updated DAYAM dawg', function() { - expectTreeAsync( + return expectTreeAsync( 'git push origin master^:master', '{"branches":{"master":{"target":"C9","id":"master","remoteTrackingBranchID":"o/master"},"foo":{"target":"C8","id":"foo","remoteTrackingBranchID":"o/foo"},"o/master":{"target":"C5","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C5","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C1"],"id":"C4"},"C5":{"parents":["C2","C4"],"id":"C5"},"C6":{"parents":["C4"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"},"C8":{"parents":["C5","C7"],"id":"C8"},"C9":{"parents":["C5"],"id":"C9"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C5","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C5","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C1"],"id":"C4"},"C5":{"parents":["C2","C4"],"id":"C5"}},"HEAD":{"target":"master","id":"HEAD"}}}', '{"branches":{"master":{"target":"C9","id":"master","remoteTrackingBranchID":"o/master"},"foo":{"target":"C8","id":"foo","remoteTrackingBranchID":"o/foo"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C5","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C1"],"id":"C4"},"C5":{"parents":["C2","C4"],"id":"C5"},"C6":{"parents":["C4"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"},"C8":{"parents":["C5","C7"],"id":"C8"},"C9":{"parents":["C5"],"id":"C9"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C5","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C1"],"id":"C4"},"C5":{"parents":["C2","C4"],"id":"C5"}},"HEAD":{"target":"master","id":"HEAD"}}}' @@ -284,130 +284,130 @@ describe('Git Remotes', function() { }); it('correctly resolves source during git fetch with params', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git push origin master:foo; git fakeTeamwork foo 2; git fetch origin foo^:blah', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null},"blah":{"target":"C2","id":"blah","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"foo","id":"HEAD"}}}' ); }); it('correctly makes a new branch during fetch despite nothing to download', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git push origin master:foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); - it('correctly resolves existing commits and updates', function() { - expectTreeAsync( + it('correctly resolves existing commits and updates', function() { + return expectTreeAsync( 'git clone; git push origin master:foo; git fakeTeamwork foo 2; git fetch origin foo^:blah;go C0; git fetch origin foo^:master', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null},"blah":{"target":"C2","id":"blah","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"C0","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"foo","id":"HEAD"}}}' ); - }); + }); - it('doesnt let you fetch to master if you are checked out there', function() { - expectTreeAsync( - 'git clone; git push origin master:foo; git fakeTeamwork foo 2; git fetch origin foo^:blah; git fetch foo:master', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null},"blah":{"target":"C2","id":"blah","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"foo","id":"HEAD"}}}' - ); - }); + it('doesn\'t let you fetch to master if you are checked out there', function() { + return expectTreeAsync( + 'git clone; git push origin master:foo; git fakeTeamwork foo 2; git fetch origin foo^:blah; git fetch foo:master', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null},"blah":{"target":"C2","id":"blah","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"foo","id":"HEAD"}}}' + ); + }); - it('doesnt let you delete branches that dont exist', function() { - expectTreeAsync( - 'git clone; git push origin :foo', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('doesn\'t let you delete branches that don\'t exist', function() { + return expectTreeAsync( + 'git clone; git push origin :foo', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('pulls to a new branch and then merges in that branch', function() { - expectTreeAsync( - 'git clone; git fakeTeamwork; git commit; git pull origin master:bar', - '{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"bar":{"target":"C2","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('pulls to a new branch and then merges in that branch', function() { + return expectTreeAsync( + 'git clone; git fakeTeamwork; git commit; git pull origin master:bar', + '{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"bar":{"target":"C2","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('makes a new branch from pull and doesnt bork', function() { - expectTreeAsync( - 'git clone; git pull origin :bar', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"bar":{"target":"C1","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('makes a new branch from pull and doesn\'t bork', function() { + return expectTreeAsync( + 'git clone; git pull origin :bar', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"bar":{"target":"C1","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('makes the new branch on push in the right place', function() { - expectTreeAsync( - 'git clone; git fakeTeamwork; git push origin master:foo', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('makes the new branch on push in the right place', function() { + return expectTreeAsync( + 'git clone; git fakeTeamwork; git push origin master:foo', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('tracks remote with -u', function() { - expectTreeAsync( - 'git clone; git branch foo; git branch -u o/master foo', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('tracks remote with -u', function() { + return expectTreeAsync( + 'git clone; git branch foo; git branch -u o/master foo', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('does not fetch if one arg is not branch ref', function() { - expectTreeAsync( - 'git clone; git fakeTeamwork 2; git fetch origin master~1', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('does not fetch if one arg is not branch ref', function() { + return expectTreeAsync( + 'git clone; git fakeTeamwork 2; git fetch origin master~1', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('creates the branch on the fly', function() { - expectTreeAsync( - 'git clone; git commit; go -b side; git push origin side', - '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":"o/side"},"o/side":{"target":"C2","id":"o/side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"side","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('creates the branch on the fly', function() { + return expectTreeAsync( + 'git clone; git commit; go -b side; git push origin side', + '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":"o/side"},"o/side":{"target":"C2","id":"o/side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"side","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('does not create the o/master branch on remote', function() { - expectTreeAsync( - 'git clone; git commit; git push origin o/master', - '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('does not create the o/master branch on remote', function() { + return expectTreeAsync( + 'git clone; git commit; git push origin o/master', + '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('pulls with rebase correctly in weird situation with no rebase to do', function() { - expectTreeAsync( - 'git checkout -b side; git commit; git checkout master; git commit; git commit; git merge side; git commit; git clone; git checkout -b main master^^^; git rebase side; git rebase main master; git push;git pull --rebase', - '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C6%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3A%22o/master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22side%22%2C%22remoteTrackingBranchID%22%3A%22o/side%22%7D%2C%22o/master%22%3A%7B%22target%22%3A%22C6%22%2C%22id%22%3A%22o/master%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22o/side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22o/side%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3Anull%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%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C2%22%2C%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%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%22C6%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C6%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22side%22%2C%22remoteTrackingBranchID%22%3Anull%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%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C2%22%2C%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%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D' - ); - }); + it('pulls with rebase correctly in weird situation with no rebase to do', function() { + return expectTreeAsync( + 'git checkout -b side; git commit; git checkout master; git commit; git commit; git merge side; git commit; git clone; git checkout -b otherMain master^^^; git rebase side; git rebase otherMain master; git push;git pull --rebase', + '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C6%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3A%22o/master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22side%22%2C%22remoteTrackingBranchID%22%3A%22o/side%22%7D%2C%22o/master%22%3A%7B%22target%22%3A%22C6%22%2C%22id%22%3A%22o/master%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22o/side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22o/side%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22otherMain%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22otherMain%22%2C%22remoteTrackingBranchID%22%3Anull%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%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C2%22%2C%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%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%22C6%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C6%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22side%22%2C%22remoteTrackingBranchID%22%3Anull%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%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C2%22%2C%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%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D' + ); + }); - it('pulls with rebase in other weird situation with just fast forward', function() { - expectTreeAsync( - 'git clone; git fakeTeamwork; git pull --rebase', + it('pulls with rebase in other weird situation with just fast forward', function() { + return expectTreeAsync( + 'git clone; git fakeTeamwork; git pull --rebase', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + ); + }); /* TODO -- enable this back when we have better async tree compare, it takes too long right now - it('will correctly resolve the dependency order of commits when fetching or pushing', function() { - expectTreeAsync( - 'git clone; git commit; git commit; git commit; git checkout -b test C2; git commit; git checkout master; git push; git checkout master; git merge test; git commit; git push; git checkout test; git commit; git commit; git checkout -b feat1 master; git commit; git merge test; git checkout master; git merge test; git checkout feat1; git commit; git checkout master; git merge feat1; git push', - '{"branches":{"master":{"target":"C14","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C7","id":"o/master","remoteTrackingBranchID":null},"test":{"target":"C9","id":"test","remoteTrackingBranchID":null},"feat1":{"target":"C13","id":"feat1","remoteTrackingBranchID":null}},"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":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"},"C8":{"parents":["C5"],"id":"C8"},"C9":{"parents":["C8"],"id":"C9"},"C10":{"parents":["C7"],"id":"C10"},"C11":{"parents":["C10","C9"],"id":"C11"},"C12":{"parents":["C7","C9"],"id":"C12"},"C13":{"parents":["C11"],"id":"C13"},"C14":{"parents":["C12","C13"],"id":"C14"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C7","id":"master","remoteTrackingBranchID":null}},"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":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); + it('will correctly resolve the dependency order of commits when fetching or pushing', function() { + return expectTreeAsync( + 'git clone; git commit; git commit; git commit; git checkout -b test C2; git commit; git checkout master; git push; git checkout master; git merge test; git commit; git push; git checkout test; git commit; git commit; git checkout -b feat1 master; git commit; git merge test; git checkout master; git merge test; git checkout feat1; git commit; git checkout master; git merge feat1; git push', + '{"branches":{"master":{"target":"C14","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C7","id":"o/master","remoteTrackingBranchID":null},"test":{"target":"C9","id":"test","remoteTrackingBranchID":null},"feat1":{"target":"C13","id":"feat1","remoteTrackingBranchID":null}},"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":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"},"C8":{"parents":["C5"],"id":"C8"},"C9":{"parents":["C8"],"id":"C9"},"C10":{"parents":["C7"],"id":"C10"},"C11":{"parents":["C10","C9"],"id":"C11"},"C12":{"parents":["C7","C9"],"id":"C12"},"C13":{"parents":["C11"],"id":"C13"},"C14":{"parents":["C12","C13"],"id":"C14"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C7","id":"master","remoteTrackingBranchID":null}},"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":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' + ); });*/ - it('uses git force to bypass upstream check', function() { - expectTreeAsync( - 'git clone; git commit; git push; go C1; git branch -f master C1; go master; git commit; git commit; go C1; git checkout -b side; git commit; go master; git merge side; git push --force', - '{"branches":{"master":{"target":"C6","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C6","id":"o/master","remoteTrackingBranchID":null},"side":{"target":"C5","id":"side","remoteTrackingBranchID":null}},"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":["C1"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C6","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C5":{"parents":["C1"],"id":"C5"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C6":{"parents":["C4","C5"],"id":"C6"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('uses git force to bypass upstream check', function() { + return expectTreeAsync( + 'git clone; git commit; git push; go C1; git branch -f master C1; go master; git commit; git commit; go C1; git checkout -b side; git commit; go master; git merge side; git push --force', + '{"branches":{"master":{"target":"C6","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C6","id":"o/master","remoteTrackingBranchID":null},"side":{"target":"C5","id":"side","remoteTrackingBranchID":null}},"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":["C1"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C6","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C5":{"parents":["C1"],"id":"C5"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C6":{"parents":["C4","C5"],"id":"C6"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); it('uses --push to delete commits', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit; git clone;git reset HEAD~1;git push --force', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); + ); }); it('uses --push to delete commits and can push again after', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit; git clone;git reset HEAD~1;git push --force;git commit; git push ', '{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C3","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); + ); }); diff --git a/__tests__/simpleRemote.spec.js b/__tests__/simpleRemote.spec.js index 247572b6..b93ed13e 100644 --- a/__tests__/simpleRemote.spec.js +++ b/__tests__/simpleRemote.spec.js @@ -3,7 +3,7 @@ var expectTreeAsync = base.expectTreeAsync; describe('Git Remote simple', function() { it('clones', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); diff --git a/__tests__/treeCompare.spec.js b/__tests__/treeCompare.spec.js index 83efa368..ffa27466 100644 --- a/__tests__/treeCompare.spec.js +++ b/__tests__/treeCompare.spec.js @@ -49,9 +49,21 @@ describe('Tree Compare', function() { ); }); + it('compares with considering leftover branches', function() { + testMethod( + { + compareAllBranchesAndEnforceBranchCleanup: true, + }, + '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"foo","id":"HEAD"}}', + { + '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":null},"randoBran":{"target":"C2","id":"randoBran","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"foo","id":"HEAD"}}': false, + }, + ); + }); + it('deep compares on origin tree', function() { testMethod( - {}, // checked for all methods so this doesnt matter + {}, // checked for all methods so this doesn't matter // state with originTree '{"branches":{"master":{"target":"C1","id":"master"},"o/master":{"target":"C1","id":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"remoteTrackingBranch":null,"remote":false,"target":"C1","id":"master","type":"branch"}},"commits":{"C0":{"type":"commit","parents":[],"author":"Peter Cottle","createTime":"Wed Jul 24 2013 09:58:50 GMT-0700 (PDT)","commitMessage":"Quick commit. Go Bears!","id":"C0","rootCommit":true},"C1":{"type":"commit","parents":["C0"],"author":"Peter Cottle","createTime":"Wed Jul 24 2013 09:58:50 GMT-0700 (PDT)","commitMessage":"Quick commit. Go Bears!","id":"C1"}},"HEAD":{"target":"master","id":"HEAD","type":"general ref"}}}', { @@ -173,5 +185,3 @@ describe('Tree Compare', function() { ); }); }); - - diff --git a/assets/emoji_table.rtf b/assets/emoji_table.rtf deleted file mode 100644 index 6704f314..00000000 --- a/assets/emoji_table.rtf +++ /dev/null @@ -1,2523 +0,0 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210 -{\fonttbl\f0\fnil\fcharset0 AppleColorEmoji;\f1\fnil\fcharset0 Monaco;\f2\fnil\fcharset77 ZapfDingbatsITC; -\f3\fnil\fcharset128 HiraKakuProN-W3;\f4\fnil\fcharset0 LucidaGrande;\f5\fnil\fcharset0 AppleSymbols; -\f6\fnil\fcharset134 STHeitiSC-Light;\f7\fnil\fcharset129 AppleSDGothicNeo-Regular;} -{\colortbl;\red255\green255\blue255;} -\margl1440\margr1440\vieww18700\viewh19820\viewkind0 -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural - -\f0\fs24 \cf0 \uc0\u55357 \u56833 -\f1 \\ud83d\\ude01 grinning face with smiling eyes\ - -\f0 \uc0\u55357 \u56834 -\f1 \\ud83d\\ude02 face with tears of joy\ - -\f0 \uc0\u55357 \u56835 -\f1 \\ud83d\\ude03 smiling face with open mouth\ - -\f0 \uc0\u55357 \u56836 -\f1 \\ud83d\\ude04 smiling face with open mouth and smiling eyes\ - -\f0 \uc0\u55357 \u56837 -\f1 \\ud83d\\ude05 smiling face with open mouth and cold sweat\ - -\f0 \uc0\u55357 \u56838 -\f1 \\ud83d\\ude06 smiling face with open mouth and tightly-closed eyes\ - -\f0 \uc0\u55357 \u56841 -\f1 \\ud83d\\ude09 winking face\ - -\f0 \uc0\u55357 \u56842 -\f1 \\ud83d\\ude0a smiling face with smiling eyes\ - -\f0 \uc0\u55357 \u56843 -\f1 \\ud83d\\ude0b face savouring delicious food\ - -\f0 \uc0\u55357 \u56844 -\f1 \\ud83d\\ude0c relieved face\ - -\f0 \uc0\u55357 \u56845 -\f1 \\ud83d\\ude0d smiling face with heart-shaped eyes\ - -\f0 \uc0\u55357 \u56847 -\f1 \\ud83d\\ude0f smirking face\ - -\f0 \uc0\u55357 \u56850 -\f1 \\ud83d\\ude12 unamused face\ - -\f0 \uc0\u55357 \u56851 -\f1 \\ud83d\\ude13 face with cold sweat\ - -\f0 \uc0\u55357 \u56852 -\f1 \\ud83d\\ude14 pensive face\ - -\f0 \uc0\u55357 \u56854 -\f1 \\ud83d\\ude16 confounded face\ - -\f0 \uc0\u55357 \u56856 -\f1 \\ud83d\\ude18 face throwing a kiss\ - -\f0 \uc0\u55357 \u56858 -\f1 \\ud83d\\ude1a kissing face with closed eyes\ - -\f0 \uc0\u55357 \u56860 -\f1 \\ud83d\\ude1c face with stuck-out tongue and winking eye\ - -\f0 \uc0\u55357 \u56861 -\f1 \\ud83d\\ude1d face with stuck-out tongue and tightly-closed eyes\ - -\f0 \uc0\u55357 \u56862 -\f1 \\ud83d\\ude1e disappointed face\ - -\f0 \uc0\u55357 \u56864 -\f1 \\ud83d\\ude20 angry face\ - -\f0 \uc0\u55357 \u56865 -\f1 \\ud83d\\ude21 pouting face\ - -\f0 \uc0\u55357 \u56866 -\f1 \\ud83d\\ude22 crying face\ - -\f0 \uc0\u55357 \u56867 -\f1 \\ud83d\\ude23 persevering face\ - -\f0 \uc0\u55357 \u56868 -\f1 \\ud83d\\ude24 face with look of triumph\ - -\f0 \uc0\u55357 \u56869 -\f1 \\ud83d\\ude25 disappointed but relieved face\ - -\f0 \uc0\u55357 \u56872 -\f1 \\ud83d\\ude28 fearful face\ - -\f0 \uc0\u55357 \u56873 -\f1 \\ud83d\\ude29 weary face\ - -\f0 \uc0\u55357 \u56874 -\f1 \\ud83d\\ude2a sleepy face\ - -\f0 \uc0\u55357 \u56875 -\f1 \\ud83d\\ude2b tired face\ - -\f0 \uc0\u55357 \u56877 -\f1 \\ud83d\\ude2d loudly crying face\ - -\f0 \uc0\u55357 \u56880 -\f1 \\ud83d\\ude30 face with open mouth and cold sweat\ - -\f0 \uc0\u55357 \u56881 -\f1 \\ud83d\\ude31 face screaming in fear\ - -\f0 \uc0\u55357 \u56882 -\f1 \\ud83d\\ude32 astonished face\ - -\f0 \uc0\u55357 \u56883 -\f1 \\ud83d\\ude33 flushed face\ - -\f0 \uc0\u55357 \u56885 -\f1 \\ud83d\\ude35 dizzy face\ - -\f0 \uc0\u55357 \u56887 -\f1 \\ud83d\\ude37 face with medical mask\ - -\f0 \uc0\u55357 \u56888 -\f1 \\ud83d\\ude38 grinning cat face with smiling eyes\ - -\f0 \uc0\u55357 \u56889 -\f1 \\ud83d\\ude39 cat face with tears of joy\ - -\f0 \uc0\u55357 \u56890 -\f1 \\ud83d\\ude3a smiling cat face with open mouth\ - -\f0 \uc0\u55357 \u56891 -\f1 \\ud83d\\ude3b smiling cat face with heart-shaped eyes\ - -\f0 \uc0\u55357 \u56892 -\f1 \\ud83d\\ude3c cat face with wry smile\ - -\f0 \uc0\u55357 \u56893 -\f1 \\ud83d\\ude3d kissing cat face with closed eyes\ - -\f0 \uc0\u55357 \u56894 -\f1 \\ud83d\\ude3e pouting cat face\ - -\f0 \uc0\u55357 \u56895 -\f1 \\ud83d\\ude3f crying cat face\ - -\f0 \uc0\u55357 \u56896 -\f1 \\ud83d\\ude40 weary cat face\ - -\f0 \uc0\u55357 \u56901 -\f1 \\ud83d\\ude45 face with no good gesture\ - -\f0 \uc0\u55357 \u56902 -\f1 \\ud83d\\ude46 face with ok gesture\ - -\f0 \uc0\u55357 \u56903 -\f1 \\ud83d\\ude47 person bowing deeply\ - -\f0 \uc0\u55357 \u56904 -\f1 \\ud83d\\ude48 see-no-evil monkey\ - -\f0 \uc0\u55357 \u56905 -\f1 \\ud83d\\ude49 hear-no-evil monkey\ - -\f0 \uc0\u55357 \u56906 -\f1 \\ud83d\\ude4a speak-no-evil monkey\ - -\f0 \uc0\u55357 \u56907 -\f1 \\ud83d\\ude4b happy person raising one hand\ - -\f0 \uc0\u55357 \u56908 -\f1 \\ud83d\\ude4c person raising both hands in celebration\ - -\f0 \uc0\u55357 \u56909 -\f1 \\ud83d\\ude4d person frowning\ - -\f0 \uc0\u55357 \u56910 -\f1 \\ud83d\\ude4e person with pouting face\ - -\f0 \uc0\u55357 \u56911 -\f1 \\ud83d\\ude4f person with folded hands\ - -\f2 \uc0\u9986 -\f1 \\u2702 black scissors\ - -\f0 \uc0\u9989 -\f1 \\u2705 white heavy check mark\ - -\f2 \uc0\u9992 -\f1 \\u2708 airplane\ - -\f2 \uc0\u9993 -\f1 \\u2709 envelope\ - -\f0 \uc0\u9994 -\f1 \\u270a raised fist\ - -\f0 \uc0\u9995 -\f1 \\u270b raised hand\ - -\f2 \uc0\u9996 -\f1 \\u270c victory hand\ - -\f2 \uc0\u9999 -\f1 \\u270f pencil\ - -\f2 \uc0\u10002 -\f1 \\u2712 black nib\ - -\f2 \uc0\u10004 -\f1 \\u2714 heavy check mark\ - -\f2 \uc0\u10006 -\f1 \\u2716 heavy multiplication x\ - -\f0 \uc0\u10024 -\f1 \\u2728 sparkles\ - -\f2 \uc0\u10035 -\f1 \\u2733 eight spoked asterisk\ - -\f2 \uc0\u10036 -\f1 \\u2734 eight pointed black star\ - -\f2 \uc0\u10052 -\f1 \\u2744 snowflake\ - -\f2 \uc0\u10055 -\f1 \\u2747 sparkle\ - -\f0 \uc0\u10060 -\f1 \\u274c cross mark\ - -\f0 \uc0\u10062 -\f1 \\u274e negative squared cross mark\ - -\f0 \uc0\u10067 -\f1 \\u2753 black question mark ornament\ - -\f0 \uc0\u10068 -\f1 \\u2754 white question mark ornament\ - -\f0 \uc0\u10069 -\f1 \\u2755 white exclamation mark ornament\ - -\f0 \uc0\u10071 -\f1 \\u2757 heavy exclamation mark symbol\ - -\f2 \uc0\u10084 -\f1 \\u2764 heavy black heart\ - -\f0 \uc0\u10133 -\f1 \\u2795 heavy plus sign\ - -\f0 \uc0\u10134 -\f1 \\u2796 heavy minus sign\ - -\f0 \uc0\u10135 -\f1 \\u2797 heavy division sign\ - -\f2 \uc0\u10145 -\f1 \\u27a1 black rightwards arrow\ - -\f0 \uc0\u10160 -\f1 \\u27b0 curly loop\ - -\f0 \uc0\u55357 \u56960 -\f1 \\ud83d\\ude80 rocket\ - -\f0 \uc0\u55357 \u56963 -\f1 \\ud83d\\ude83 railway car\ - -\f0 \uc0\u55357 \u56964 -\f1 \\ud83d\\ude84 high-speed train\ - -\f0 \uc0\u55357 \u56965 -\f1 \\ud83d\\ude85 high-speed train with bullet nose\ - -\f0 \uc0\u55357 \u56967 -\f1 \\ud83d\\ude87 metro\ - -\f0 \uc0\u55357 \u56969 -\f1 \\ud83d\\ude89 station\ - -\f0 \uc0\u55357 \u56972 -\f1 \\ud83d\\ude8c bus\ - -\f0 \uc0\u55357 \u56975 -\f1 \\ud83d\\ude8f bus stop\ - -\f0 \uc0\u55357 \u56977 -\f1 \\ud83d\\ude91 ambulance\ - -\f0 \uc0\u55357 \u56978 -\f1 \\ud83d\\ude92 fire engine\ - -\f0 \uc0\u55357 \u56979 -\f1 \\ud83d\\ude93 police car\ - -\f0 \uc0\u55357 \u56981 -\f1 \\ud83d\\ude95 taxi\ - -\f0 \uc0\u55357 \u56983 -\f1 \\ud83d\\ude97 automobile\ - -\f0 \uc0\u55357 \u56985 -\f1 \\ud83d\\ude99 recreational vehicle\ - -\f0 \uc0\u55357 \u56986 -\f1 \\ud83d\\ude9a delivery truck\ - -\f0 \uc0\u55357 \u56994 -\f1 \\ud83d\\udea2 ship\ - -\f0 \uc0\u55357 \u56996 -\f1 \\ud83d\\udea4 speedboat\ - -\f0 \uc0\u55357 \u56997 -\f1 \\ud83d\\udea5 horizontal traffic light\ - -\f0 \uc0\u55357 \u56999 -\f1 \\ud83d\\udea7 construction sign\ - -\f0 \uc0\u55357 \u57000 -\f1 \\ud83d\\udea8 police cars revolving light\ - -\f0 \uc0\u55357 \u57001 -\f1 \\ud83d\\udea9 triangular flag on post\ - -\f0 \uc0\u55357 \u57002 -\f1 \\ud83d\\udeaa door\ - -\f0 \uc0\u55357 \u57003 -\f1 \\ud83d\\udeab no entry sign\ - -\f0 \uc0\u55357 \u57004 -\f1 \\ud83d\\udeac smoking symbol\ - -\f0 \uc0\u55357 \u57005 -\f1 \\ud83d\\udead no smoking symbol\ - -\f0 \uc0\u55357 \u57010 -\f1 \\ud83d\\udeb2 bicycle\ - -\f0 \uc0\u55357 \u57014 -\f1 \\ud83d\\udeb6 pedestrian\ - -\f0 \uc0\u55357 \u57017 -\f1 \\ud83d\\udeb9 mens symbol\ - -\f0 \uc0\u55357 \u57018 -\f1 \\ud83d\\udeba womens symbol\ - -\f0 \uc0\u55357 \u57019 -\f1 \\ud83d\\udebb restroom\ - -\f0 \uc0\u55357 \u57020 -\f1 \\ud83d\\udebc baby symbol\ - -\f0 \uc0\u55357 \u57021 -\f1 \\ud83d\\udebd toilet\ - -\f0 \uc0\u55357 \u57022 -\f1 \\ud83d\\udebe water closet\ - -\f0 \uc0\u55357 \u57024 -\f1 \\ud83d\\udec0 bath\ - -\f3 \uc0\u9410 -\f1 \\u24c2 circled latin capital letter m\ - -\f3 \uc0\u55356 \u56688 -\f1 \\ud83c\\udd70 negative squared latin capital letter a\ - -\f3 \uc0\u55356 \u56689 -\f1 \\ud83c\\udd71 negative squared latin capital letter b\ - -\f3 \uc0\u55356 \u56702 -\f1 \\ud83c\\udd7e negative squared latin capital letter o\ - -\f3 \uc0\u55356 \u56703 -\f1 \\ud83c\\udd7f negative squared latin capital letter p\ - -\f0 \uc0\u55356 \u56718 -\f1 \\ud83c\\udd8e negative squared ab\ - -\f0 \uc0\u55356 \u56721 -\f1 \\ud83c\\udd91 squared cl\ - -\f0 \uc0\u55356 \u56722 -\f1 \\ud83c\\udd92 squared cool\ - -\f0 \uc0\u55356 \u56723 -\f1 \\ud83c\\udd93 squared free\ - -\f0 \uc0\u55356 \u56724 -\f1 \\ud83c\\udd94 squared id\ - -\f0 \uc0\u55356 \u56725 -\f1 \\ud83c\\udd95 squared new\ - -\f0 \uc0\u55356 \u56726 -\f1 \\ud83c\\udd96 squared ng\ - -\f0 \uc0\u55356 \u56727 -\f1 \\ud83c\\udd97 squared ok\ - -\f0 \uc0\u55356 \u56728 -\f1 \\ud83c\\udd98 squared sos\ - -\f0 \uc0\u55356 \u56729 -\f1 \\ud83c\\udd99 squared up with exclamation mark\ - -\f0 \uc0\u55356 \u56730 -\f1 \\ud83c\\udd9a squared vs\ - -\f0 \uc0\u55356 \u56809 \u55356 \u56810 -\f1 \\ud83c\\udde9\\ud83c\\uddea regional indicator symbol letter d + regional indicator symbol letter e\ - -\f0 \uc0\u55356 \u56812 \u55356 \u56807 -\f1 \\ud83c\\uddec\\ud83c\\udde7 regional indicator symbol letter g + regional indicator symbol letter b\ - -\f0 \uc0\u55356 \u56808 \u55356 \u56819 -\f1 \\ud83c\\udde8\\ud83c\\uddf3 regional indicator symbol letter c + regional indicator symbol letter n\ - -\f0 \uc0\u55356 \u56815 \u55356 \u56821 -\f1 \\ud83c\\uddef\\ud83c\\uddf5 regional indicator symbol letter j + regional indicator symbol letter p\ - -\f0 \uc0\u55356 \u56816 \u55356 \u56823 -\f1 \\ud83c\\uddf0\\ud83c\\uddf7 regional indicator symbol letter k + regional indicator symbol letter r\ - -\f0 \uc0\u55356 \u56811 \u55356 \u56823 -\f1 \\ud83c\\uddeb\\ud83c\\uddf7 regional indicator symbol letter f + regional indicator symbol letter r\ - -\f0 \uc0\u55356 \u56810 \u55356 \u56824 -\f1 \\ud83c\\uddea\\ud83c\\uddf8 regional indicator symbol letter e + regional indicator symbol letter s\ - -\f0 \uc0\u55356 \u56814 \u55356 \u56825 -\f1 \\ud83c\\uddee\\ud83c\\uddf9 regional indicator symbol letter i + regional indicator symbol letter t\ - -\f0 \uc0\u55356 \u56826 \u55356 \u56824 -\f1 \\ud83c\\uddfa\\ud83c\\uddf8 regional indicator symbol letter u + regional indicator symbol letter s\ - -\f0 \uc0\u55356 \u56823 \u55356 \u56826 -\f1 \\ud83c\\uddf7\\ud83c\\uddfa regional indicator symbol letter r + regional indicator symbol letter u\ - -\f0 \uc0\u55356 \u56833 -\f1 \\ud83c\\ude01 squared katakana koko\ - -\f3 \uc0\u55356 \u56834 -\f1 \\ud83c\\ude02 squared katakana sa\ - -\f0 \uc0\u55356 \u56858 -\f1 \\ud83c\\ude1a squared cjk unified ideograph-7121\ - -\f0 \uc0\u55356 \u56879 -\f1 \\ud83c\\ude2f squared cjk unified ideograph-6307\ - -\f0 \uc0\u55356 \u56882 -\f1 \\ud83c\\ude32 squared cjk unified ideograph-7981\ - -\f0 \uc0\u55356 \u56883 -\f1 \\ud83c\\ude33 squared cjk unified ideograph-7a7a\ - -\f0 \uc0\u55356 \u56884 -\f1 \\ud83c\\ude34 squared cjk unified ideograph-5408\ - -\f0 \uc0\u55356 \u56885 -\f1 \\ud83c\\ude35 squared cjk unified ideograph-6e80\ - -\f0 \uc0\u55356 \u56886 -\f1 \\ud83c\\ude36 squared cjk unified ideograph-6709\ - -\f3 \uc0\u55356 \u56887 -\f1 \\ud83c\\ude37 squared cjk unified ideograph-6708\ - -\f0 \uc0\u55356 \u56888 -\f1 \\ud83c\\ude38 squared cjk unified ideograph-7533\ - -\f0 \uc0\u55356 \u56889 -\f1 \\ud83c\\ude39 squared cjk unified ideograph-5272\ - -\f0 \uc0\u55356 \u56890 -\f1 \\ud83c\\ude3a squared cjk unified ideograph-55b6\ - -\f0 \uc0\u55356 \u56912 -\f1 \\ud83c\\ude50 circled ideograph advantage\ - -\f0 \uc0\u55356 \u56913 -\f1 \\ud83c\\ude51 circled ideograph accept\ -\'a9 \\ua9 copyright sign\ -\'ae \\uae registered sign\ -\uc0\u8252 \\u203c double exclamation mark\ -\uc0\u8265 \\u2049 exclamation question mark\ - -\f4 8\uc0\u8419 -\f1 \\u38\\u20e3 digit eight + combining enclosing keycap\ - -\f4 9\uc0\u8419 -\f1 \\u39\\u20e3 digit nine + combining enclosing keycap\ - -\f4 7\uc0\u8419 -\f1 \\u37\\u20e3 digit seven + combining enclosing keycap\ - -\f4 6\uc0\u8419 -\f1 \\u36\\u20e3 digit six + combining enclosing keycap\ - -\f4 1\uc0\u8419 -\f1 \\u31\\u20e3 digit one + combining enclosing keycap\ - -\f4 0\uc0\u8419 -\f1 \\u30\\u20e3 digit zero + combining enclosing keycap\ - -\f4 2\uc0\u8419 -\f1 \\u32\\u20e3 digit two + combining enclosing keycap\ - -\f4 3\uc0\u8419 -\f1 \\u33\\u20e3 digit three + combining enclosing keycap\ - -\f4 5\uc0\u8419 -\f1 \\u35\\u20e3 digit five + combining enclosing keycap\ - -\f4 4\uc0\u8419 -\f1 \\u34\\u20e3 digit four + combining enclosing keycap\ - -\f4 #\uc0\u8419 -\f1 \\u23\\u20e3 number sign + combining enclosing keycap\ -\'99 \\u2122 trade mark sign\ - -\f5 \uc0\u8505 -\f1 \\u2139 information source\ - -\f3 \uc0\u8596 -\f1 \\u2194 left right arrow\ - -\f6 \uc0\u8597 -\f1 \\u2195 up down arrow\ - -\f4 \uc0\u8598 -\f1 \\u2196 north west arrow\ - -\f3 \uc0\u8599 -\f1 \\u2197 north east arrow\ - -\f4 \uc0\u8600 -\f1 \\u2198 south east arrow\ - -\f3 \uc0\u8601 -\f1 \\u2199 south west arrow\ - -\f4 \uc0\u8617 -\f1 \\u21a9 leftwards arrow with hook\ - -\f4 \uc0\u8618 -\f1 \\u21aa rightwards arrow with hook\ - -\f0 \uc0\u8986 -\f1 \\u231a watch\ - -\f0 \uc0\u8987 -\f1 \\u231b hourglass\ - -\f0 \uc0\u9193 -\f1 \\u23e9 black right-pointing double triangle\ - -\f0 \uc0\u9194 -\f1 \\u23ea black left-pointing double triangle\ - -\f0 \uc0\u9195 -\f1 \\u23eb black up-pointing double triangle\ - -\f0 \uc0\u9196 -\f1 \\u23ec black down-pointing double triangle\ - -\f0 \uc0\u9200 -\f1 \\u23f0 alarm clock\ - -\f0 \uc0\u9203 -\f1 \\u23f3 hourglass with flowing sand\ - -\f4 \uc0\u9642 -\f1 \\u25aa black small square\ - -\f4 \uc0\u9643 -\f1 \\u25ab white small square\ - -\f4 \uc0\u9654 -\f1 \\u25b6 black right-pointing triangle\ - -\f3 \uc0\u9664 -\f1 \\u25c0 black left-pointing triangle\ - -\f7 \uc0\u9723 -\f1 \\u25fb white medium square\ - -\f7 \uc0\u9724 -\f1 \\u25fc black medium square\ - -\f0 \uc0\u9725 -\f1 \\u25fd white medium small square\ - -\f0 \uc0\u9726 -\f1 \\u25fe black medium small square\ - -\f3 \uc0\u9728 -\f1 \\u2600 black sun with rays\ - -\f3 \uc0\u9729 -\f1 \\u2601 cloud\ - -\f3 \uc0\u9742 -\f1 \\u260e black telephone\ - -\f5 \uc0\u9745 -\f1 \\u2611 ballot box with check\ - -\f0 \uc0\u9748 -\f1 \\u2614 umbrella with rain drops\ - -\f0 \uc0\u9749 -\f1 \\u2615 hot beverage\ - -\f3 \uc0\u9757 -\f1 \\u261d white up pointing index\ - -\f6 \uc0\u9786 -\f1 \\u263a white smiling face\ - -\f0 \uc0\u9800 -\f1 \\u2648 aries\ - -\f0 \uc0\u9801 -\f1 \\u2649 taurus\ - -\f0 \uc0\u9802 -\f1 \\u264a gemini\ - -\f0 \uc0\u9803 -\f1 \\u264b cancer\ - -\f0 \uc0\u9804 -\f1 \\u264c leo\ - -\f0 \uc0\u9805 -\f1 \\u264d virgo\ - -\f0 \uc0\u9806 -\f1 \\u264e libra\ - -\f0 \uc0\u9807 -\f1 \\u264f scorpius\ - -\f0 \uc0\u9808 -\f1 \\u2650 sagittarius\ - -\f0 \uc0\u9809 -\f1 \\u2651 capricorn\ - -\f0 \uc0\u9810 -\f1 \\u2652 aquarius\ - -\f0 \uc0\u9811 -\f1 \\u2653 pisces\ - -\f3 \uc0\u9824 -\f1 \\u2660 black spade suit\ - -\f3 \uc0\u9827 -\f1 \\u2663 black club suit\ - -\f3 \uc0\u9829 -\f1 \\u2665 black heart suit\ - -\f3 \uc0\u9830 -\f1 \\u2666 black diamond suit\ - -\f3 \uc0\u9832 -\f1 \\u2668 hot springs\ - -\f3 \uc0\u9851 -\f1 \\u267b black universal recycling symbol\ - -\f0 \uc0\u9855 -\f1 \\u267f wheelchair symbol\ - -\f0 \uc0\u9875 -\f1 \\u2693 anchor\ - -\f3 \uc0\u9888 -\f1 \\u26a0 warning sign\ - -\f0 \uc0\u9889 -\f1 \\u26a1 high voltage sign\ - -\f0 \uc0\u9898 -\f1 \\u26aa medium white circle\ - -\f0 \uc0\u9899 -\f1 \\u26ab medium black circle\ - -\f0 \uc0\u9917 -\f1 \\u26bd soccer ball\ - -\f3 \uc0\u9918 -\f1 \\u26be baseball\ - -\f0 \uc0\u9924 -\f1 \\u26c4 snowman without snow\ - -\f0 \uc0\u9925 -\f1 \\u26c5 sun behind cloud\ - -\f0 \uc0\u9934 -\f1 \\u26ce ophiuchus\ - -\f0 \uc0\u9940 -\f1 \\u26d4 no entry\ - -\f0 \uc0\u9962 -\f1 \\u26ea church\ - -\f0 \uc0\u9970 -\f1 \\u26f2 fountain\ - -\f0 \uc0\u9971 -\f1 \\u26f3 flag in hole\ - -\f0 \uc0\u9973 -\f1 \\u26f5 sailboat\ - -\f0 \uc0\u9978 -\f1 \\u26fa tent\ - -\f0 \uc0\u9981 -\f1 \\u26fd fuel pump\ - -\f3 \uc0\u10548 -\f1 \\u2934 arrow pointing rightwards then curving upwards\ - -\f3 \uc0\u10549 -\f1 \\u2935 arrow pointing rightwards then curving downwards\ - -\f3 \uc0\u11013 -\f1 \\u2b05 leftwards black arrow\ - -\f3 \uc0\u11014 -\f1 \\u2b06 upwards black arrow\ - -\f3 \uc0\u11015 -\f1 \\u2b07 downwards black arrow\ - -\f0 \uc0\u11035 -\f1 \\u2b1b black large square\ - -\f0 \uc0\u11036 -\f1 \\u2b1c white large square\ - -\f0 \uc0\u11088 -\f1 \\u2b50 white medium star\ - -\f0 \uc0\u11093 -\f1 \\u2b55 heavy large circle\ - -\f3 \uc0\u12336 -\f1 \\u3030 wavy dash\ - -\f3 \uc0\u12349 -\f1 \\u303d part alternation mark\ - -\f3 \uc0\u12951 -\f1 \\u3297 circled ideograph congratulation\ - -\f3 \uc0\u12953 -\f1 \\u3299 circled ideograph secret\ - -\f0 \uc0\u55356 \u56324 -\f1 \\ud83c\\udc04 mahjong tile red dragon\ - -\f0 \uc0\u55356 \u56527 -\f1 \\ud83c\\udccf playing card black joker\ - -\f0 \uc0\u55356 \u57088 -\f1 \\ud83c\\udf00 cyclone\ - -\f0 \uc0\u55356 \u57089 -\f1 \\ud83c\\udf01 foggy\ - -\f0 \uc0\u55356 \u57090 -\f1 \\ud83c\\udf02 closed umbrella\ - -\f0 \uc0\u55356 \u57091 -\f1 \\ud83c\\udf03 night with stars\ - -\f0 \uc0\u55356 \u57092 -\f1 \\ud83c\\udf04 sunrise over mountains\ - -\f0 \uc0\u55356 \u57093 -\f1 \\ud83c\\udf05 sunrise\ - -\f0 \uc0\u55356 \u57094 -\f1 \\ud83c\\udf06 cityscape at dusk\ - -\f0 \uc0\u55356 \u57095 -\f1 \\ud83c\\udf07 sunset over buildings\ - -\f0 \uc0\u55356 \u57096 -\f1 \\ud83c\\udf08 rainbow\ - -\f0 \uc0\u55356 \u57097 -\f1 \\ud83c\\udf09 bridge at night\ - -\f0 \uc0\u55356 \u57098 -\f1 \\ud83c\\udf0a water wave\ - -\f0 \uc0\u55356 \u57099 -\f1 \\ud83c\\udf0b volcano\ - -\f0 \uc0\u55356 \u57100 -\f1 \\ud83c\\udf0c milky way\ - -\f0 \uc0\u55356 \u57103 -\f1 \\ud83c\\udf0f earth globe asia-australia\ - -\f0 \uc0\u55356 \u57105 -\f1 \\ud83c\\udf11 new moon symbol\ - -\f0 \uc0\u55356 \u57107 -\f1 \\ud83c\\udf13 first quarter moon symbol\ - -\f0 \uc0\u55356 \u57108 -\f1 \\ud83c\\udf14 waxing gibbous moon symbol\ - -\f0 \uc0\u55356 \u57109 -\f1 \\ud83c\\udf15 full moon symbol\ - -\f0 \uc0\u55356 \u57113 -\f1 \\ud83c\\udf19 crescent moon\ - -\f0 \uc0\u55356 \u57115 -\f1 \\ud83c\\udf1b first quarter moon with face\ - -\f0 \uc0\u55356 \u57119 -\f1 \\ud83c\\udf1f glowing star\ - -\f0 \uc0\u55356 \u57120 -\f1 \\ud83c\\udf20 shooting star\ - -\f0 \uc0\u55356 \u57136 -\f1 \\ud83c\\udf30 chestnut\ - -\f0 \uc0\u55356 \u57137 -\f1 \\ud83c\\udf31 seedling\ - -\f0 \uc0\u55356 \u57140 -\f1 \\ud83c\\udf34 palm tree\ - -\f0 \uc0\u55356 \u57141 -\f1 \\ud83c\\udf35 cactus\ - -\f0 \uc0\u55356 \u57143 -\f1 \\ud83c\\udf37 tulip\ - -\f0 \uc0\u55356 \u57144 -\f1 \\ud83c\\udf38 cherry blossom\ - -\f0 \uc0\u55356 \u57145 -\f1 \\ud83c\\udf39 rose\ - -\f0 \uc0\u55356 \u57146 -\f1 \\ud83c\\udf3a hibiscus\ - -\f0 \uc0\u55356 \u57147 -\f1 \\ud83c\\udf3b sunflower\ - -\f0 \uc0\u55356 \u57148 -\f1 \\ud83c\\udf3c blossom\ - -\f0 \uc0\u55356 \u57149 -\f1 \\ud83c\\udf3d ear of maize\ - -\f0 \uc0\u55356 \u57150 -\f1 \\ud83c\\udf3e ear of rice\ - -\f0 \uc0\u55356 \u57151 -\f1 \\ud83c\\udf3f herb\ - -\f0 \uc0\u55356 \u57152 -\f1 \\ud83c\\udf40 four leaf clover\ - -\f0 \uc0\u55356 \u57153 -\f1 \\ud83c\\udf41 maple leaf\ - -\f0 \uc0\u55356 \u57154 -\f1 \\ud83c\\udf42 fallen leaf\ - -\f0 \uc0\u55356 \u57155 -\f1 \\ud83c\\udf43 leaf fluttering in wind\ - -\f0 \uc0\u55356 \u57156 -\f1 \\ud83c\\udf44 mushroom\ - -\f0 \uc0\u55356 \u57157 -\f1 \\ud83c\\udf45 tomato\ - -\f0 \uc0\u55356 \u57158 -\f1 \\ud83c\\udf46 aubergine\ - -\f0 \uc0\u55356 \u57159 -\f1 \\ud83c\\udf47 grapes\ - -\f0 \uc0\u55356 \u57160 -\f1 \\ud83c\\udf48 melon\ - -\f0 \uc0\u55356 \u57161 -\f1 \\ud83c\\udf49 watermelon\ - -\f0 \uc0\u55356 \u57162 -\f1 \\ud83c\\udf4a tangerine\ - -\f0 \uc0\u55356 \u57164 -\f1 \\ud83c\\udf4c banana\ - -\f0 \uc0\u55356 \u57165 -\f1 \\ud83c\\udf4d pineapple\ - -\f0 \uc0\u55356 \u57166 -\f1 \\ud83c\\udf4e red apple\ - -\f0 \uc0\u55356 \u57167 -\f1 \\ud83c\\udf4f green apple\ - -\f0 \uc0\u55356 \u57169 -\f1 \\ud83c\\udf51 peach\ - -\f0 \uc0\u55356 \u57170 -\f1 \\ud83c\\udf52 cherries\ - -\f0 \uc0\u55356 \u57171 -\f1 \\ud83c\\udf53 strawberry\ - -\f0 \uc0\u55356 \u57172 -\f1 \\ud83c\\udf54 hamburger\ - -\f0 \uc0\u55356 \u57173 -\f1 \\ud83c\\udf55 slice of pizza\ - -\f0 \uc0\u55356 \u57174 -\f1 \\ud83c\\udf56 meat on bone\ - -\f0 \uc0\u55356 \u57175 -\f1 \\ud83c\\udf57 poultry leg\ - -\f0 \uc0\u55356 \u57176 -\f1 \\ud83c\\udf58 rice cracker\ - -\f0 \uc0\u55356 \u57177 -\f1 \\ud83c\\udf59 rice ball\ - -\f0 \uc0\u55356 \u57178 -\f1 \\ud83c\\udf5a cooked rice\ - -\f0 \uc0\u55356 \u57179 -\f1 \\ud83c\\udf5b curry and rice\ - -\f0 \uc0\u55356 \u57180 -\f1 \\ud83c\\udf5c steaming bowl\ - -\f0 \uc0\u55356 \u57181 -\f1 \\ud83c\\udf5d spaghetti\ - -\f0 \uc0\u55356 \u57182 -\f1 \\ud83c\\udf5e bread\ - -\f0 \uc0\u55356 \u57183 -\f1 \\ud83c\\udf5f french fries\ - -\f0 \uc0\u55356 \u57184 -\f1 \\ud83c\\udf60 roasted sweet potato\ - -\f0 \uc0\u55356 \u57185 -\f1 \\ud83c\\udf61 dango\ - -\f0 \uc0\u55356 \u57186 -\f1 \\ud83c\\udf62 oden\ - -\f0 \uc0\u55356 \u57187 -\f1 \\ud83c\\udf63 sushi\ - -\f0 \uc0\u55356 \u57188 -\f1 \\ud83c\\udf64 fried shrimp\ - -\f0 \uc0\u55356 \u57189 -\f1 \\ud83c\\udf65 fish cake with swirl design\ - -\f0 \uc0\u55356 \u57190 -\f1 \\ud83c\\udf66 soft ice cream\ - -\f0 \uc0\u55356 \u57191 -\f1 \\ud83c\\udf67 shaved ice\ - -\f0 \uc0\u55356 \u57192 -\f1 \\ud83c\\udf68 ice cream\ - -\f0 \uc0\u55356 \u57193 -\f1 \\ud83c\\udf69 doughnut\ - -\f0 \uc0\u55356 \u57194 -\f1 \\ud83c\\udf6a cookie\ - -\f0 \uc0\u55356 \u57195 -\f1 \\ud83c\\udf6b chocolate bar\ - -\f0 \uc0\u55356 \u57196 -\f1 \\ud83c\\udf6c candy\ - -\f0 \uc0\u55356 \u57197 -\f1 \\ud83c\\udf6d lollipop\ - -\f0 \uc0\u55356 \u57198 -\f1 \\ud83c\\udf6e custard\ - -\f0 \uc0\u55356 \u57199 -\f1 \\ud83c\\udf6f honey pot\ - -\f0 \uc0\u55356 \u57200 -\f1 \\ud83c\\udf70 shortcake\ - -\f0 \uc0\u55356 \u57201 -\f1 \\ud83c\\udf71 bento box\ - -\f0 \uc0\u55356 \u57202 -\f1 \\ud83c\\udf72 pot of food\ - -\f0 \uc0\u55356 \u57203 -\f1 \\ud83c\\udf73 cooking\ - -\f0 \uc0\u55356 \u57204 -\f1 \\ud83c\\udf74 fork and knife\ - -\f0 \uc0\u55356 \u57205 -\f1 \\ud83c\\udf75 teacup without handle\ - -\f0 \uc0\u55356 \u57206 -\f1 \\ud83c\\udf76 sake bottle and cup\ - -\f0 \uc0\u55356 \u57207 -\f1 \\ud83c\\udf77 wine glass\ - -\f0 \uc0\u55356 \u57208 -\f1 \\ud83c\\udf78 cocktail glass\ - -\f0 \uc0\u55356 \u57209 -\f1 \\ud83c\\udf79 tropical drink\ - -\f0 \uc0\u55356 \u57210 -\f1 \\ud83c\\udf7a beer mug\ - -\f0 \uc0\u55356 \u57211 -\f1 \\ud83c\\udf7b clinking beer mugs\ - -\f0 \uc0\u55356 \u57216 -\f1 \\ud83c\\udf80 ribbon\ - -\f0 \uc0\u55356 \u57217 -\f1 \\ud83c\\udf81 wrapped present\ - -\f0 \uc0\u55356 \u57218 -\f1 \\ud83c\\udf82 birthday cake\ - -\f0 \uc0\u55356 \u57219 -\f1 \\ud83c\\udf83 jack-o-lantern\ - -\f0 \uc0\u55356 \u57220 -\f1 \\ud83c\\udf84 christmas tree\ - -\f0 \uc0\u55356 \u57221 -\f1 \\ud83c\\udf85 father christmas\ - -\f0 \uc0\u55356 \u57222 -\f1 \\ud83c\\udf86 fireworks\ - -\f0 \uc0\u55356 \u57223 -\f1 \\ud83c\\udf87 firework sparkler\ - -\f0 \uc0\u55356 \u57224 -\f1 \\ud83c\\udf88 balloon\ - -\f0 \uc0\u55356 \u57225 -\f1 \\ud83c\\udf89 party popper\ - -\f0 \uc0\u55356 \u57226 -\f1 \\ud83c\\udf8a confetti ball\ - -\f0 \uc0\u55356 \u57227 -\f1 \\ud83c\\udf8b tanabata tree\ - -\f0 \uc0\u55356 \u57228 -\f1 \\ud83c\\udf8c crossed flags\ - -\f0 \uc0\u55356 \u57229 -\f1 \\ud83c\\udf8d pine decoration\ - -\f0 \uc0\u55356 \u57230 -\f1 \\ud83c\\udf8e japanese dolls\ - -\f0 \uc0\u55356 \u57231 -\f1 \\ud83c\\udf8f carp streamer\ - -\f0 \uc0\u55356 \u57232 -\f1 \\ud83c\\udf90 wind chime\ - -\f0 \uc0\u55356 \u57233 -\f1 \\ud83c\\udf91 moon viewing ceremony\ - -\f0 \uc0\u55356 \u57234 -\f1 \\ud83c\\udf92 school satchel\ - -\f0 \uc0\u55356 \u57235 -\f1 \\ud83c\\udf93 graduation cap\ - -\f0 \uc0\u55356 \u57248 -\f1 \\ud83c\\udfa0 carousel horse\ - -\f0 \uc0\u55356 \u57249 -\f1 \\ud83c\\udfa1 ferris wheel\ - -\f0 \uc0\u55356 \u57250 -\f1 \\ud83c\\udfa2 roller coaster\ - -\f0 \uc0\u55356 \u57251 -\f1 \\ud83c\\udfa3 fishing pole and fish\ - -\f0 \uc0\u55356 \u57252 -\f1 \\ud83c\\udfa4 microphone\ - -\f0 \uc0\u55356 \u57253 -\f1 \\ud83c\\udfa5 movie camera\ - -\f0 \uc0\u55356 \u57254 -\f1 \\ud83c\\udfa6 cinema\ - -\f0 \uc0\u55356 \u57255 -\f1 \\ud83c\\udfa7 headphone\ - -\f0 \uc0\u55356 \u57256 -\f1 \\ud83c\\udfa8 artist palette\ - -\f0 \uc0\u55356 \u57257 -\f1 \\ud83c\\udfa9 top hat\ - -\f0 \uc0\u55356 \u57258 -\f1 \\ud83c\\udfaa circus tent\ - -\f0 \uc0\u55356 \u57259 -\f1 \\ud83c\\udfab ticket\ - -\f0 \uc0\u55356 \u57260 -\f1 \\ud83c\\udfac clapper board\ - -\f0 \uc0\u55356 \u57261 -\f1 \\ud83c\\udfad performing arts\ - -\f0 \uc0\u55356 \u57262 -\f1 \\ud83c\\udfae video game\ - -\f0 \uc0\u55356 \u57263 -\f1 \\ud83c\\udfaf direct hit\ - -\f0 \uc0\u55356 \u57264 -\f1 \\ud83c\\udfb0 slot machine\ - -\f0 \uc0\u55356 \u57265 -\f1 \\ud83c\\udfb1 billiards\ - -\f0 \uc0\u55356 \u57266 -\f1 \\ud83c\\udfb2 game die\ - -\f0 \uc0\u55356 \u57267 -\f1 \\ud83c\\udfb3 bowling\ - -\f0 \uc0\u55356 \u57268 -\f1 \\ud83c\\udfb4 flower playing cards\ - -\f0 \uc0\u55356 \u57269 -\f1 \\ud83c\\udfb5 musical note\ - -\f0 \uc0\u55356 \u57270 -\f1 \\ud83c\\udfb6 multiple musical notes\ - -\f0 \uc0\u55356 \u57271 -\f1 \\ud83c\\udfb7 saxophone\ - -\f0 \uc0\u55356 \u57272 -\f1 \\ud83c\\udfb8 guitar\ - -\f0 \uc0\u55356 \u57273 -\f1 \\ud83c\\udfb9 musical keyboard\ - -\f0 \uc0\u55356 \u57274 -\f1 \\ud83c\\udfba trumpet\ - -\f0 \uc0\u55356 \u57275 -\f1 \\ud83c\\udfbb violin\ - -\f0 \uc0\u55356 \u57276 -\f1 \\ud83c\\udfbc musical score\ - -\f0 \uc0\u55356 \u57277 -\f1 \\ud83c\\udfbd running shirt with sash\ - -\f0 \uc0\u55356 \u57278 -\f1 \\ud83c\\udfbe tennis racquet and ball\ - -\f0 \uc0\u55356 \u57279 -\f1 \\ud83c\\udfbf ski and ski boot\ - -\f0 \uc0\u55356 \u57280 -\f1 \\ud83c\\udfc0 basketball and hoop\ - -\f0 \uc0\u55356 \u57281 -\f1 \\ud83c\\udfc1 chequered flag\ - -\f0 \uc0\u55356 \u57282 -\f1 \\ud83c\\udfc2 snowboarder\ - -\f0 \uc0\u55356 \u57283 -\f1 \\ud83c\\udfc3 runner\ - -\f0 \uc0\u55356 \u57284 -\f1 \\ud83c\\udfc4 surfer\ - -\f0 \uc0\u55356 \u57286 -\f1 \\ud83c\\udfc6 trophy\ - -\f0 \uc0\u55356 \u57288 -\f1 \\ud83c\\udfc8 american football\ - -\f0 \uc0\u55356 \u57290 -\f1 \\ud83c\\udfca swimmer\ - -\f0 \uc0\u55356 \u57312 -\f1 \\ud83c\\udfe0 house building\ - -\f0 \uc0\u55356 \u57313 -\f1 \\ud83c\\udfe1 house with garden\ - -\f0 \uc0\u55356 \u57314 -\f1 \\ud83c\\udfe2 office building\ - -\f0 \uc0\u55356 \u57315 -\f1 \\ud83c\\udfe3 japanese post office\ - -\f0 \uc0\u55356 \u57317 -\f1 \\ud83c\\udfe5 hospital\ - -\f0 \uc0\u55356 \u57318 -\f1 \\ud83c\\udfe6 bank\ - -\f0 \uc0\u55356 \u57319 -\f1 \\ud83c\\udfe7 automated teller machine\ - -\f0 \uc0\u55356 \u57320 -\f1 \\ud83c\\udfe8 hotel\ - -\f0 \uc0\u55356 \u57321 -\f1 \\ud83c\\udfe9 love hotel\ - -\f0 \uc0\u55356 \u57322 -\f1 \\ud83c\\udfea convenience store\ - -\f0 \uc0\u55356 \u57323 -\f1 \\ud83c\\udfeb school\ - -\f0 \uc0\u55356 \u57324 -\f1 \\ud83c\\udfec department store\ - -\f0 \uc0\u55356 \u57325 -\f1 \\ud83c\\udfed factory\ - -\f0 \uc0\u55356 \u57326 -\f1 \\ud83c\\udfee izakaya lantern\ - -\f0 \uc0\u55356 \u57327 -\f1 \\ud83c\\udfef japanese castle\ - -\f0 \uc0\u55356 \u57328 -\f1 \\ud83c\\udff0 european castle\ - -\f0 \uc0\u55357 \u56332 -\f1 \\ud83d\\udc0c snail\ - -\f0 \uc0\u55357 \u56333 -\f1 \\ud83d\\udc0d snake\ - -\f0 \uc0\u55357 \u56334 -\f1 \\ud83d\\udc0e horse\ - -\f0 \uc0\u55357 \u56337 -\f1 \\ud83d\\udc11 sheep\ - -\f0 \uc0\u55357 \u56338 -\f1 \\ud83d\\udc12 monkey\ - -\f0 \uc0\u55357 \u56340 -\f1 \\ud83d\\udc14 chicken\ - -\f0 \uc0\u55357 \u56343 -\f1 \\ud83d\\udc17 boar\ - -\f0 \uc0\u55357 \u56344 -\f1 \\ud83d\\udc18 elephant\ - -\f0 \uc0\u55357 \u56345 -\f1 \\ud83d\\udc19 octopus\ - -\f0 \uc0\u55357 \u56346 -\f1 \\ud83d\\udc1a spiral shell\ - -\f0 \uc0\u55357 \u56347 -\f1 \\ud83d\\udc1b bug\ - -\f0 \uc0\u55357 \u56348 -\f1 \\ud83d\\udc1c ant\ - -\f0 \uc0\u55357 \u56349 -\f1 \\ud83d\\udc1d honeybee\ - -\f0 \uc0\u55357 \u56350 -\f1 \\ud83d\\udc1e lady beetle\ - -\f0 \uc0\u55357 \u56351 -\f1 \\ud83d\\udc1f fish\ - -\f0 \uc0\u55357 \u56352 -\f1 \\ud83d\\udc20 tropical fish\ - -\f0 \uc0\u55357 \u56353 -\f1 \\ud83d\\udc21 blowfish\ - -\f0 \uc0\u55357 \u56354 -\f1 \\ud83d\\udc22 turtle\ - -\f0 \uc0\u55357 \u56355 -\f1 \\ud83d\\udc23 hatching chick\ - -\f0 \uc0\u55357 \u56356 -\f1 \\ud83d\\udc24 baby chick\ - -\f0 \uc0\u55357 \u56357 -\f1 \\ud83d\\udc25 front-facing baby chick\ - -\f0 \uc0\u55357 \u56358 -\f1 \\ud83d\\udc26 bird\ - -\f0 \uc0\u55357 \u56359 -\f1 \\ud83d\\udc27 penguin\ - -\f0 \uc0\u55357 \u56360 -\f1 \\ud83d\\udc28 koala\ - -\f0 \uc0\u55357 \u56361 -\f1 \\ud83d\\udc29 poodle\ - -\f0 \uc0\u55357 \u56363 -\f1 \\ud83d\\udc2b bactrian camel\ - -\f0 \uc0\u55357 \u56364 -\f1 \\ud83d\\udc2c dolphin\ - -\f0 \uc0\u55357 \u56365 -\f1 \\ud83d\\udc2d mouse face\ - -\f0 \uc0\u55357 \u56366 -\f1 \\ud83d\\udc2e cow face\ - -\f0 \uc0\u55357 \u56367 -\f1 \\ud83d\\udc2f tiger face\ - -\f0 \uc0\u55357 \u56368 -\f1 \\ud83d\\udc30 rabbit face\ - -\f0 \uc0\u55357 \u56369 -\f1 \\ud83d\\udc31 cat face\ - -\f0 \uc0\u55357 \u56370 -\f1 \\ud83d\\udc32 dragon face\ - -\f0 \uc0\u55357 \u56371 -\f1 \\ud83d\\udc33 spouting whale\ - -\f0 \uc0\u55357 \u56372 -\f1 \\ud83d\\udc34 horse face\ - -\f0 \uc0\u55357 \u56373 -\f1 \\ud83d\\udc35 monkey face\ - -\f0 \uc0\u55357 \u56374 -\f1 \\ud83d\\udc36 dog face\ - -\f0 \uc0\u55357 \u56375 -\f1 \\ud83d\\udc37 pig face\ - -\f0 \uc0\u55357 \u56376 -\f1 \\ud83d\\udc38 frog face\ - -\f0 \uc0\u55357 \u56377 -\f1 \\ud83d\\udc39 hamster face\ - -\f0 \uc0\u55357 \u56378 -\f1 \\ud83d\\udc3a wolf face\ - -\f0 \uc0\u55357 \u56379 -\f1 \\ud83d\\udc3b bear face\ - -\f0 \uc0\u55357 \u56380 -\f1 \\ud83d\\udc3c panda face\ - -\f0 \uc0\u55357 \u56381 -\f1 \\ud83d\\udc3d pig nose\ - -\f0 \uc0\u55357 \u56382 -\f1 \\ud83d\\udc3e paw prints\ - -\f0 \uc0\u55357 \u56384 -\f1 \\ud83d\\udc40 eyes\ - -\f0 \uc0\u55357 \u56386 -\f1 \\ud83d\\udc42 ear\ - -\f0 \uc0\u55357 \u56387 -\f1 \\ud83d\\udc43 nose\ - -\f0 \uc0\u55357 \u56388 -\f1 \\ud83d\\udc44 mouth\ - -\f0 \uc0\u55357 \u56389 -\f1 \\ud83d\\udc45 tongue\ - -\f0 \uc0\u55357 \u56390 -\f1 \\ud83d\\udc46 white up pointing backhand index\ - -\f0 \uc0\u55357 \u56391 -\f1 \\ud83d\\udc47 white down pointing backhand index\ - -\f0 \uc0\u55357 \u56392 -\f1 \\ud83d\\udc48 white left pointing backhand index\ - -\f0 \uc0\u55357 \u56393 -\f1 \\ud83d\\udc49 white right pointing backhand index\ - -\f0 \uc0\u55357 \u56394 -\f1 \\ud83d\\udc4a fisted hand sign\ - -\f0 \uc0\u55357 \u56395 -\f1 \\ud83d\\udc4b waving hand sign\ - -\f0 \uc0\u55357 \u56396 -\f1 \\ud83d\\udc4c ok hand sign\ - -\f0 \uc0\u55357 \u56397 -\f1 \\ud83d\\udc4d thumbs up sign\ - -\f0 \uc0\u55357 \u56398 -\f1 \\ud83d\\udc4e thumbs down sign\ - -\f0 \uc0\u55357 \u56399 -\f1 \\ud83d\\udc4f clapping hands sign\ - -\f0 \uc0\u55357 \u56400 -\f1 \\ud83d\\udc50 open hands sign\ - -\f0 \uc0\u55357 \u56401 -\f1 \\ud83d\\udc51 crown\ - -\f0 \uc0\u55357 \u56402 -\f1 \\ud83d\\udc52 womans hat\ - -\f0 \uc0\u55357 \u56403 -\f1 \\ud83d\\udc53 eyeglasses\ - -\f0 \uc0\u55357 \u56404 -\f1 \\ud83d\\udc54 necktie\ - -\f0 \uc0\u55357 \u56405 -\f1 \\ud83d\\udc55 t-shirt\ - -\f0 \uc0\u55357 \u56406 -\f1 \\ud83d\\udc56 jeans\ - -\f0 \uc0\u55357 \u56407 -\f1 \\ud83d\\udc57 dress\ - -\f0 \uc0\u55357 \u56408 -\f1 \\ud83d\\udc58 kimono\ - -\f0 \uc0\u55357 \u56409 -\f1 \\ud83d\\udc59 bikini\ - -\f0 \uc0\u55357 \u56410 -\f1 \\ud83d\\udc5a womans clothes\ - -\f0 \uc0\u55357 \u56411 -\f1 \\ud83d\\udc5b purse\ - -\f0 \uc0\u55357 \u56412 -\f1 \\ud83d\\udc5c handbag\ - -\f0 \uc0\u55357 \u56413 -\f1 \\ud83d\\udc5d pouch\ - -\f0 \uc0\u55357 \u56414 -\f1 \\ud83d\\udc5e mans shoe\ - -\f0 \uc0\u55357 \u56415 -\f1 \\ud83d\\udc5f athletic shoe\ - -\f0 \uc0\u55357 \u56416 -\f1 \\ud83d\\udc60 high-heeled shoe\ - -\f0 \uc0\u55357 \u56417 -\f1 \\ud83d\\udc61 womans sandal\ - -\f0 \uc0\u55357 \u56418 -\f1 \\ud83d\\udc62 womans boots\ - -\f0 \uc0\u55357 \u56419 -\f1 \\ud83d\\udc63 footprints\ - -\f0 \uc0\u55357 \u56420 -\f1 \\ud83d\\udc64 bust in silhouette\ - -\f0 \uc0\u55357 \u56422 -\f1 \\ud83d\\udc66 boy\ - -\f0 \uc0\u55357 \u56423 -\f1 \\ud83d\\udc67 girl\ - -\f0 \uc0\u55357 \u56424 -\f1 \\ud83d\\udc68 man\ - -\f0 \uc0\u55357 \u56425 -\f1 \\ud83d\\udc69 woman\ - -\f0 \uc0\u55357 \u56426 -\f1 \\ud83d\\udc6a family\ - -\f0 \uc0\u55357 \u56427 -\f1 \\ud83d\\udc6b man and woman holding hands\ - -\f0 \uc0\u55357 \u56430 -\f1 \\ud83d\\udc6e police officer\ - -\f0 \uc0\u55357 \u56431 -\f1 \\ud83d\\udc6f woman with bunny ears\ - -\f0 \uc0\u55357 \u56432 -\f1 \\ud83d\\udc70 bride with veil\ - -\f0 \uc0\u55357 \u56433 -\f1 \\ud83d\\udc71 person with blond hair\ - -\f0 \uc0\u55357 \u56434 -\f1 \\ud83d\\udc72 man with gua pi mao\ - -\f0 \uc0\u55357 \u56435 -\f1 \\ud83d\\udc73 man with turban\ - -\f0 \uc0\u55357 \u56436 -\f1 \\ud83d\\udc74 older man\ - -\f0 \uc0\u55357 \u56437 -\f1 \\ud83d\\udc75 older woman\ - -\f0 \uc0\u55357 \u56438 -\f1 \\ud83d\\udc76 baby\ - -\f0 \uc0\u55357 \u56439 -\f1 \\ud83d\\udc77 construction worker\ - -\f0 \uc0\u55357 \u56440 -\f1 \\ud83d\\udc78 princess\ - -\f0 \uc0\u55357 \u56441 -\f1 \\ud83d\\udc79 japanese ogre\ - -\f0 \uc0\u55357 \u56442 -\f1 \\ud83d\\udc7a japanese goblin\ - -\f0 \uc0\u55357 \u56443 -\f1 \\ud83d\\udc7b ghost\ - -\f0 \uc0\u55357 \u56444 -\f1 \\ud83d\\udc7c baby angel\ - -\f0 \uc0\u55357 \u56445 -\f1 \\ud83d\\udc7d extraterrestrial alien\ - -\f0 \uc0\u55357 \u56446 -\f1 \\ud83d\\udc7e alien monster\ - -\f0 \uc0\u55357 \u56447 -\f1 \\ud83d\\udc7f imp\ - -\f0 \uc0\u55357 \u56448 -\f1 \\ud83d\\udc80 skull\ - -\f0 \uc0\u55357 \u56449 -\f1 \\ud83d\\udc81 information desk person\ - -\f0 \uc0\u55357 \u56450 -\f1 \\ud83d\\udc82 guardsman\ - -\f0 \uc0\u55357 \u56451 -\f1 \\ud83d\\udc83 dancer\ - -\f0 \uc0\u55357 \u56452 -\f1 \\ud83d\\udc84 lipstick\ - -\f0 \uc0\u55357 \u56453 -\f1 \\ud83d\\udc85 nail polish\ - -\f0 \uc0\u55357 \u56454 -\f1 \\ud83d\\udc86 face massage\ - -\f0 \uc0\u55357 \u56455 -\f1 \\ud83d\\udc87 haircut\ - -\f0 \uc0\u55357 \u56456 -\f1 \\ud83d\\udc88 barber pole\ - -\f0 \uc0\u55357 \u56457 -\f1 \\ud83d\\udc89 syringe\ - -\f0 \uc0\u55357 \u56458 -\f1 \\ud83d\\udc8a pill\ - -\f0 \uc0\u55357 \u56459 -\f1 \\ud83d\\udc8b kiss mark\ - -\f0 \uc0\u55357 \u56460 -\f1 \\ud83d\\udc8c love letter\ - -\f0 \uc0\u55357 \u56461 -\f1 \\ud83d\\udc8d ring\ - -\f0 \uc0\u55357 \u56462 -\f1 \\ud83d\\udc8e gem stone\ - -\f0 \uc0\u55357 \u56463 -\f1 \\ud83d\\udc8f kiss\ - -\f0 \uc0\u55357 \u56464 -\f1 \\ud83d\\udc90 bouquet\ - -\f0 \uc0\u55357 \u56465 -\f1 \\ud83d\\udc91 couple with heart\ - -\f0 \uc0\u55357 \u56466 -\f1 \\ud83d\\udc92 wedding\ - -\f0 \uc0\u55357 \u56467 -\f1 \\ud83d\\udc93 beating heart\ - -\f0 \uc0\u55357 \u56468 -\f1 \\ud83d\\udc94 broken heart\ - -\f0 \uc0\u55357 \u56469 -\f1 \\ud83d\\udc95 two hearts\ - -\f0 \uc0\u55357 \u56470 -\f1 \\ud83d\\udc96 sparkling heart\ - -\f0 \uc0\u55357 \u56471 -\f1 \\ud83d\\udc97 growing heart\ - -\f0 \uc0\u55357 \u56472 -\f1 \\ud83d\\udc98 heart with arrow\ - -\f0 \uc0\u55357 \u56473 -\f1 \\ud83d\\udc99 blue heart\ - -\f0 \uc0\u55357 \u56474 -\f1 \\ud83d\\udc9a green heart\ - -\f0 \uc0\u55357 \u56475 -\f1 \\ud83d\\udc9b yellow heart\ - -\f0 \uc0\u55357 \u56476 -\f1 \\ud83d\\udc9c purple heart\ - -\f0 \uc0\u55357 \u56477 -\f1 \\ud83d\\udc9d heart with ribbon\ - -\f0 \uc0\u55357 \u56478 -\f1 \\ud83d\\udc9e revolving hearts\ - -\f0 \uc0\u55357 \u56479 -\f1 \\ud83d\\udc9f heart decoration\ - -\f0 \uc0\u55357 \u56480 -\f1 \\ud83d\\udca0 diamond shape with a dot inside\ - -\f0 \uc0\u55357 \u56481 -\f1 \\ud83d\\udca1 electric light bulb\ - -\f0 \uc0\u55357 \u56482 -\f1 \\ud83d\\udca2 anger symbol\ - -\f0 \uc0\u55357 \u56483 -\f1 \\ud83d\\udca3 bomb\ - -\f0 \uc0\u55357 \u56484 -\f1 \\ud83d\\udca4 sleeping symbol\ - -\f0 \uc0\u55357 \u56485 -\f1 \\ud83d\\udca5 collision symbol\ - -\f0 \uc0\u55357 \u56486 -\f1 \\ud83d\\udca6 splashing sweat symbol\ - -\f0 \uc0\u55357 \u56487 -\f1 \\ud83d\\udca7 droplet\ - -\f0 \uc0\u55357 \u56488 -\f1 \\ud83d\\udca8 dash symbol\ - -\f0 \uc0\u55357 \u56489 -\f1 \\ud83d\\udca9 pile of poo\ - -\f0 \uc0\u55357 \u56490 -\f1 \\ud83d\\udcaa flexed biceps\ - -\f0 \uc0\u55357 \u56491 -\f1 \\ud83d\\udcab dizzy symbol\ - -\f0 \uc0\u55357 \u56492 -\f1 \\ud83d\\udcac speech balloon\ - -\f0 \uc0\u55357 \u56494 -\f1 \\ud83d\\udcae white flower\ - -\f0 \uc0\u55357 \u56495 -\f1 \\ud83d\\udcaf hundred points symbol\ - -\f0 \uc0\u55357 \u56496 -\f1 \\ud83d\\udcb0 money bag\ - -\f0 \uc0\u55357 \u56497 -\f1 \\ud83d\\udcb1 currency exchange\ - -\f0 \uc0\u55357 \u56498 -\f1 \\ud83d\\udcb2 heavy dollar sign\ - -\f0 \uc0\u55357 \u56499 -\f1 \\ud83d\\udcb3 credit card\ - -\f0 \uc0\u55357 \u56500 -\f1 \\ud83d\\udcb4 banknote with yen sign\ - -\f0 \uc0\u55357 \u56501 -\f1 \\ud83d\\udcb5 banknote with dollar sign\ - -\f0 \uc0\u55357 \u56504 -\f1 \\ud83d\\udcb8 money with wings\ - -\f0 \uc0\u55357 \u56505 -\f1 \\ud83d\\udcb9 chart with upwards trend and yen sign\ - -\f0 \uc0\u55357 \u56506 -\f1 \\ud83d\\udcba seat\ - -\f0 \uc0\u55357 \u56507 -\f1 \\ud83d\\udcbb personal computer\ - -\f0 \uc0\u55357 \u56508 -\f1 \\ud83d\\udcbc briefcase\ - -\f0 \uc0\u55357 \u56509 -\f1 \\ud83d\\udcbd minidisc\ - -\f0 \uc0\u55357 \u56510 -\f1 \\ud83d\\udcbe floppy disk\ - -\f0 \uc0\u55357 \u56511 -\f1 \\ud83d\\udcbf optical disc\ - -\f0 \uc0\u55357 \u56512 -\f1 \\ud83d\\udcc0 dvd\ - -\f0 \uc0\u55357 \u56513 -\f1 \\ud83d\\udcc1 file folder\ - -\f0 \uc0\u55357 \u56514 -\f1 \\ud83d\\udcc2 open file folder\ - -\f0 \uc0\u55357 \u56515 -\f1 \\ud83d\\udcc3 page with curl\ - -\f0 \uc0\u55357 \u56516 -\f1 \\ud83d\\udcc4 page facing up\ - -\f0 \uc0\u55357 \u56517 -\f1 \\ud83d\\udcc5 calendar\ - -\f0 \uc0\u55357 \u56518 -\f1 \\ud83d\\udcc6 tear-off calendar\ - -\f0 \uc0\u55357 \u56519 -\f1 \\ud83d\\udcc7 card index\ - -\f0 \uc0\u55357 \u56520 -\f1 \\ud83d\\udcc8 chart with upwards trend\ - -\f0 \uc0\u55357 \u56521 -\f1 \\ud83d\\udcc9 chart with downwards trend\ - -\f0 \uc0\u55357 \u56522 -\f1 \\ud83d\\udcca bar chart\ - -\f0 \uc0\u55357 \u56523 -\f1 \\ud83d\\udccb clipboard\ - -\f0 \uc0\u55357 \u56524 -\f1 \\ud83d\\udccc pushpin\ - -\f0 \uc0\u55357 \u56525 -\f1 \\ud83d\\udccd round pushpin\ - -\f0 \uc0\u55357 \u56526 -\f1 \\ud83d\\udcce paperclip\ - -\f0 \uc0\u55357 \u56527 -\f1 \\ud83d\\udccf straight ruler\ - -\f0 \uc0\u55357 \u56528 -\f1 \\ud83d\\udcd0 triangular ruler\ - -\f0 \uc0\u55357 \u56529 -\f1 \\ud83d\\udcd1 bookmark tabs\ - -\f0 \uc0\u55357 \u56530 -\f1 \\ud83d\\udcd2 ledger\ - -\f0 \uc0\u55357 \u56531 -\f1 \\ud83d\\udcd3 notebook\ - -\f0 \uc0\u55357 \u56532 -\f1 \\ud83d\\udcd4 notebook with decorative cover\ - -\f0 \uc0\u55357 \u56533 -\f1 \\ud83d\\udcd5 closed book\ - -\f0 \uc0\u55357 \u56534 -\f1 \\ud83d\\udcd6 open book\ - -\f0 \uc0\u55357 \u56535 -\f1 \\ud83d\\udcd7 green book\ - -\f0 \uc0\u55357 \u56536 -\f1 \\ud83d\\udcd8 blue book\ - -\f0 \uc0\u55357 \u56537 -\f1 \\ud83d\\udcd9 orange book\ - -\f0 \uc0\u55357 \u56538 -\f1 \\ud83d\\udcda books\ - -\f0 \uc0\u55357 \u56539 -\f1 \\ud83d\\udcdb name badge\ - -\f0 \uc0\u55357 \u56540 -\f1 \\ud83d\\udcdc scroll\ - -\f0 \uc0\u55357 \u56541 -\f1 \\ud83d\\udcdd memo\ - -\f0 \uc0\u55357 \u56542 -\f1 \\ud83d\\udcde telephone receiver\ - -\f0 \uc0\u55357 \u56543 -\f1 \\ud83d\\udcdf pager\ - -\f0 \uc0\u55357 \u56544 -\f1 \\ud83d\\udce0 fax machine\ - -\f0 \uc0\u55357 \u56545 -\f1 \\ud83d\\udce1 satellite antenna\ - -\f0 \uc0\u55357 \u56546 -\f1 \\ud83d\\udce2 public address loudspeaker\ - -\f0 \uc0\u55357 \u56547 -\f1 \\ud83d\\udce3 cheering megaphone\ - -\f0 \uc0\u55357 \u56548 -\f1 \\ud83d\\udce4 outbox tray\ - -\f0 \uc0\u55357 \u56549 -\f1 \\ud83d\\udce5 inbox tray\ - -\f0 \uc0\u55357 \u56550 -\f1 \\ud83d\\udce6 package\ - -\f0 \uc0\u55357 \u56551 -\f1 \\ud83d\\udce7 e-mail symbol\ - -\f0 \uc0\u55357 \u56552 -\f1 \\ud83d\\udce8 incoming envelope\ - -\f0 \uc0\u55357 \u56553 -\f1 \\ud83d\\udce9 envelope with downwards arrow above\ - -\f0 \uc0\u55357 \u56554 -\f1 \\ud83d\\udcea closed mailbox with lowered flag\ - -\f0 \uc0\u55357 \u56555 -\f1 \\ud83d\\udceb closed mailbox with raised flag\ - -\f0 \uc0\u55357 \u56558 -\f1 \\ud83d\\udcee postbox\ - -\f0 \uc0\u55357 \u56560 -\f1 \\ud83d\\udcf0 newspaper\ - -\f0 \uc0\u55357 \u56561 -\f1 \\ud83d\\udcf1 mobile phone\ - -\f0 \uc0\u55357 \u56562 -\f1 \\ud83d\\udcf2 mobile phone with rightwards arrow at left\ - -\f0 \uc0\u55357 \u56563 -\f1 \\ud83d\\udcf3 vibration mode\ - -\f0 \uc0\u55357 \u56564 -\f1 \\ud83d\\udcf4 mobile phone off\ - -\f0 \uc0\u55357 \u56566 -\f1 \\ud83d\\udcf6 antenna with bars\ - -\f0 \uc0\u55357 \u56567 -\f1 \\ud83d\\udcf7 camera\ - -\f0 \uc0\u55357 \u56569 -\f1 \\ud83d\\udcf9 video camera\ - -\f0 \uc0\u55357 \u56570 -\f1 \\ud83d\\udcfa television\ - -\f0 \uc0\u55357 \u56571 -\f1 \\ud83d\\udcfb radio\ - -\f0 \uc0\u55357 \u56572 -\f1 \\ud83d\\udcfc videocassette\ - -\f0 \uc0\u55357 \u56579 -\f1 \\ud83d\\udd03 clockwise downwards and upwards open circle arrows\ - -\f0 \uc0\u55357 \u56586 -\f1 \\ud83d\\udd0a speaker with three sound waves\ - -\f0 \uc0\u55357 \u56587 -\f1 \\ud83d\\udd0b battery\ - -\f0 \uc0\u55357 \u56588 -\f1 \\ud83d\\udd0c electric plug\ - -\f0 \uc0\u55357 \u56589 -\f1 \\ud83d\\udd0d left-pointing magnifying glass\ - -\f0 \uc0\u55357 \u56590 -\f1 \\ud83d\\udd0e right-pointing magnifying glass\ - -\f0 \uc0\u55357 \u56591 -\f1 \\ud83d\\udd0f lock with ink pen\ - -\f0 \uc0\u55357 \u56592 -\f1 \\ud83d\\udd10 closed lock with key\ - -\f0 \uc0\u55357 \u56593 -\f1 \\ud83d\\udd11 key\ - -\f0 \uc0\u55357 \u56594 -\f1 \\ud83d\\udd12 lock\ - -\f0 \uc0\u55357 \u56595 -\f1 \\ud83d\\udd13 open lock\ - -\f0 \uc0\u55357 \u56596 -\f1 \\ud83d\\udd14 bell\ - -\f0 \uc0\u55357 \u56598 -\f1 \\ud83d\\udd16 bookmark\ - -\f0 \uc0\u55357 \u56599 -\f1 \\ud83d\\udd17 link symbol\ - -\f0 \uc0\u55357 \u56600 -\f1 \\ud83d\\udd18 radio button\ - -\f0 \uc0\u55357 \u56601 -\f1 \\ud83d\\udd19 back with leftwards arrow above\ - -\f0 \uc0\u55357 \u56602 -\f1 \\ud83d\\udd1a end with leftwards arrow above\ - -\f0 \uc0\u55357 \u56603 -\f1 \\ud83d\\udd1b on with exclamation mark with left right arrow above\ - -\f0 \uc0\u55357 \u56604 -\f1 \\ud83d\\udd1c soon with rightwards arrow above\ - -\f0 \uc0\u55357 \u56605 -\f1 \\ud83d\\udd1d top with upwards arrow above\ - -\f0 \uc0\u55357 \u56606 -\f1 \\ud83d\\udd1e no one under eighteen symbol\ - -\f0 \uc0\u55357 \u56607 -\f1 \\ud83d\\udd1f keycap ten\ - -\f0 \uc0\u55357 \u56608 -\f1 \\ud83d\\udd20 input symbol for latin capital letters\ - -\f0 \uc0\u55357 \u56609 -\f1 \\ud83d\\udd21 input symbol for latin small letters\ - -\f0 \uc0\u55357 \u56610 -\f1 \\ud83d\\udd22 input symbol for numbers\ - -\f0 \uc0\u55357 \u56611 -\f1 \\ud83d\\udd23 input symbol for symbols\ - -\f0 \uc0\u55357 \u56612 -\f1 \\ud83d\\udd24 input symbol for latin letters\ - -\f0 \uc0\u55357 \u56613 -\f1 \\ud83d\\udd25 fire\ - -\f0 \uc0\u55357 \u56614 -\f1 \\ud83d\\udd26 electric torch\ - -\f0 \uc0\u55357 \u56615 -\f1 \\ud83d\\udd27 wrench\ - -\f0 \uc0\u55357 \u56616 -\f1 \\ud83d\\udd28 hammer\ - -\f0 \uc0\u55357 \u56617 -\f1 \\ud83d\\udd29 nut and bolt\ - -\f0 \uc0\u55357 \u56618 -\f1 \\ud83d\\udd2a hocho\ - -\f0 \uc0\u55357 \u56619 -\f1 \\ud83d\\udd2b pistol\ - -\f0 \uc0\u55357 \u56622 -\f1 \\ud83d\\udd2e crystal ball\ - -\f0 \uc0\u55357 \u56623 -\f1 \\ud83d\\udd2f six pointed star with middle dot\ - -\f0 \uc0\u55357 \u56624 -\f1 \\ud83d\\udd30 japanese symbol for beginner\ - -\f0 \uc0\u55357 \u56625 -\f1 \\ud83d\\udd31 trident emblem\ - -\f0 \uc0\u55357 \u56626 -\f1 \\ud83d\\udd32 black square button\ - -\f0 \uc0\u55357 \u56627 -\f1 \\ud83d\\udd33 white square button\ - -\f0 \uc0\u55357 \u56628 -\f1 \\ud83d\\udd34 large red circle\ - -\f0 \uc0\u55357 \u56629 -\f1 \\ud83d\\udd35 large blue circle\ - -\f0 \uc0\u55357 \u56630 -\f1 \\ud83d\\udd36 large orange diamond\ - -\f0 \uc0\u55357 \u56631 -\f1 \\ud83d\\udd37 large blue diamond\ - -\f0 \uc0\u55357 \u56632 -\f1 \\ud83d\\udd38 small orange diamond\ - -\f0 \uc0\u55357 \u56633 -\f1 \\ud83d\\udd39 small blue diamond\ - -\f0 \uc0\u55357 \u56634 -\f1 \\ud83d\\udd3a up-pointing red triangle\ - -\f0 \uc0\u55357 \u56635 -\f1 \\ud83d\\udd3b down-pointing red triangle\ - -\f0 \uc0\u55357 \u56636 -\f1 \\ud83d\\udd3c up-pointing small red triangle\ - -\f0 \uc0\u55357 \u56637 -\f1 \\ud83d\\udd3d down-pointing small red triangle\ - -\f0 \uc0\u55357 \u56656 -\f1 \\ud83d\\udd50 clock face one oclock\ - -\f0 \uc0\u55357 \u56657 -\f1 \\ud83d\\udd51 clock face two oclock\ - -\f0 \uc0\u55357 \u56658 -\f1 \\ud83d\\udd52 clock face three oclock\ - -\f0 \uc0\u55357 \u56659 -\f1 \\ud83d\\udd53 clock face four oclock\ - -\f0 \uc0\u55357 \u56660 -\f1 \\ud83d\\udd54 clock face five oclock\ - -\f0 \uc0\u55357 \u56661 -\f1 \\ud83d\\udd55 clock face six oclock\ - -\f0 \uc0\u55357 \u56662 -\f1 \\ud83d\\udd56 clock face seven oclock\ - -\f0 \uc0\u55357 \u56663 -\f1 \\ud83d\\udd57 clock face eight oclock\ - -\f0 \uc0\u55357 \u56664 -\f1 \\ud83d\\udd58 clock face nine oclock\ - -\f0 \uc0\u55357 \u56665 -\f1 \\ud83d\\udd59 clock face ten oclock\ - -\f0 \uc0\u55357 \u56666 -\f1 \\ud83d\\udd5a clock face eleven oclock\ - -\f0 \uc0\u55357 \u56667 -\f1 \\ud83d\\udd5b clock face twelve oclock\ - -\f0 \uc0\u55357 \u56827 -\f1 \\ud83d\\uddfb mount fuji\ - -\f0 \uc0\u55357 \u56828 -\f1 \\ud83d\\uddfc tokyo tower\ - -\f0 \uc0\u55357 \u56829 -\f1 \\ud83d\\uddfd statue of liberty\ - -\f0 \uc0\u55357 \u56830 -\f1 \\ud83d\\uddfe silhouette of japan\ - -\f0 \uc0\u55357 \u56831 -\f1 \\ud83d\\uddff moyai\ - -\f0 \uc0\u55357 \u56832 -\f1 \\ud83d\\ude00 grinning face\ - -\f0 \uc0\u55357 \u56839 -\f1 \\ud83d\\ude07 smiling face with halo\ - -\f0 \uc0\u55357 \u56840 -\f1 \\ud83d\\ude08 smiling face with horns\ - -\f0 \uc0\u55357 \u56846 -\f1 \\ud83d\\ude0e smiling face with sunglasses\ - -\f0 \uc0\u55357 \u56848 -\f1 \\ud83d\\ude10 neutral face\ - -\f0 \uc0\u55357 \u56849 -\f1 \\ud83d\\ude11 expressionless face\ - -\f0 \uc0\u55357 \u56853 -\f1 \\ud83d\\ude15 confused face\ - -\f0 \uc0\u55357 \u56855 -\f1 \\ud83d\\ude17 kissing face\ - -\f0 \uc0\u55357 \u56857 -\f1 \\ud83d\\ude19 kissing face with smiling eyes\ - -\f0 \uc0\u55357 \u56859 -\f1 \\ud83d\\ude1b face with stuck-out tongue\ - -\f0 \uc0\u55357 \u56863 -\f1 \\ud83d\\ude1f worried face\ - -\f0 \uc0\u55357 \u56870 -\f1 \\ud83d\\ude26 frowning face with open mouth\ - -\f0 \uc0\u55357 \u56871 -\f1 \\ud83d\\ude27 anguished face\ - -\f0 \uc0\u55357 \u56876 -\f1 \\ud83d\\ude2c grimacing face\ - -\f0 \uc0\u55357 \u56878 -\f1 \\ud83d\\ude2e face with open mouth\ - -\f0 \uc0\u55357 \u56879 -\f1 \\ud83d\\ude2f hushed face\ - -\f0 \uc0\u55357 \u56884 -\f1 \\ud83d\\ude34 sleeping face\ - -\f0 \uc0\u55357 \u56886 -\f1 \\ud83d\\ude36 face without mouth\ - -\f0 \uc0\u55357 \u56961 -\f1 \\ud83d\\ude81 helicopter\ - -\f0 \uc0\u55357 \u56962 -\f1 \\ud83d\\ude82 steam locomotive\ - -\f0 \uc0\u55357 \u56966 -\f1 \\ud83d\\ude86 train\ - -\f0 \uc0\u55357 \u56968 -\f1 \\ud83d\\ude88 light rail\ - -\f0 \uc0\u55357 \u56970 -\f1 \\ud83d\\ude8a tram\ - -\f0 \uc0\u55357 \u56973 -\f1 \\ud83d\\ude8d oncoming bus\ - -\f0 \uc0\u55357 \u56974 -\f1 \\ud83d\\ude8e trolleybus\ - -\f0 \uc0\u55357 \u56976 -\f1 \\ud83d\\ude90 minibus\ - -\f0 \uc0\u55357 \u56980 -\f1 \\ud83d\\ude94 oncoming police car\ - -\f0 \uc0\u55357 \u56982 -\f1 \\ud83d\\ude96 oncoming taxi\ - -\f0 \uc0\u55357 \u56984 -\f1 \\ud83d\\ude98 oncoming automobile\ - -\f0 \uc0\u55357 \u56987 -\f1 \\ud83d\\ude9b articulated lorry\ - -\f0 \uc0\u55357 \u56988 -\f1 \\ud83d\\ude9c tractor\ - -\f0 \uc0\u55357 \u56989 -\f1 \\ud83d\\ude9d monorail\ - -\f0 \uc0\u55357 \u56990 -\f1 \\ud83d\\ude9e mountain railway\ - -\f0 \uc0\u55357 \u56991 -\f1 \\ud83d\\ude9f suspension railway\ - -\f0 \uc0\u55357 \u56992 -\f1 \\ud83d\\udea0 mountain cableway\ - -\f0 \uc0\u55357 \u56993 -\f1 \\ud83d\\udea1 aerial tramway\ - -\f0 \uc0\u55357 \u56995 -\f1 \\ud83d\\udea3 rowboat\ - -\f0 \uc0\u55357 \u56998 -\f1 \\ud83d\\udea6 vertical traffic light\ - -\f0 \uc0\u55357 \u57006 -\f1 \\ud83d\\udeae put litter in its place symbol\ - -\f0 \uc0\u55357 \u57007 -\f1 \\ud83d\\udeaf do not litter symbol\ - -\f0 \uc0\u55357 \u57008 -\f1 \\ud83d\\udeb0 potable water symbol\ - -\f0 \uc0\u55357 \u57009 -\f1 \\ud83d\\udeb1 non-potable water symbol\ - -\f0 \uc0\u55357 \u57011 -\f1 \\ud83d\\udeb3 no bicycles\ - -\f0 \uc0\u55357 \u57012 -\f1 \\ud83d\\udeb4 bicyclist\ - -\f0 \uc0\u55357 \u57013 -\f1 \\ud83d\\udeb5 mountain bicyclist\ - -\f0 \uc0\u55357 \u57015 -\f1 \\ud83d\\udeb7 no pedestrians\ - -\f0 \uc0\u55357 \u57016 -\f1 \\ud83d\\udeb8 children crossing\ - -\f0 \uc0\u55357 \u57023 -\f1 \\ud83d\\udebf shower\ - -\f0 \uc0\u55357 \u57025 -\f1 \\ud83d\\udec1 bathtub\ - -\f0 \uc0\u55357 \u57026 -\f1 \\ud83d\\udec2 passport control\ - -\f0 \uc0\u55357 \u57027 -\f1 \\ud83d\\udec3 customs\ - -\f0 \uc0\u55357 \u57028 -\f1 \\ud83d\\udec4 baggage claim\ - -\f0 \uc0\u55357 \u57029 -\f1 \\ud83d\\udec5 left luggage\ - -\f0 \uc0\u55356 \u57101 -\f1 \\ud83c\\udf0d earth globe europe-africa\ - -\f0 \uc0\u55356 \u57102 -\f1 \\ud83c\\udf0e earth globe americas\ - -\f0 \uc0\u55356 \u57104 -\f1 \\ud83c\\udf10 globe with meridians\ - -\f0 \uc0\u55356 \u57106 -\f1 \\ud83c\\udf12 waxing crescent moon symbol\ - -\f0 \uc0\u55356 \u57110 -\f1 \\ud83c\\udf16 waning gibbous moon symbol\ - -\f0 \uc0\u55356 \u57111 -\f1 \\ud83c\\udf17 last quarter moon symbol\ - -\f0 \uc0\u55356 \u57112 -\f1 \\ud83c\\udf18 waning crescent moon symbol\ - -\f0 \uc0\u55356 \u57114 -\f1 \\ud83c\\udf1a new moon with face\ - -\f0 \uc0\u55356 \u57116 -\f1 \\ud83c\\udf1c last quarter moon with face\ - -\f0 \uc0\u55356 \u57117 -\f1 \\ud83c\\udf1d full moon with face\ - -\f0 \uc0\u55356 \u57118 -\f1 \\ud83c\\udf1e sun with face\ - -\f0 \uc0\u55356 \u57138 -\f1 \\ud83c\\udf32 evergreen tree\ - -\f0 \uc0\u55356 \u57139 -\f1 \\ud83c\\udf33 deciduous tree\ - -\f0 \uc0\u55356 \u57163 -\f1 \\ud83c\\udf4b lemon\ - -\f0 \uc0\u55356 \u57168 -\f1 \\ud83c\\udf50 pear\ - -\f0 \uc0\u55356 \u57212 -\f1 \\ud83c\\udf7c baby bottle\ - -\f0 \uc0\u55356 \u57287 -\f1 \\ud83c\\udfc7 horse racing\ - -\f0 \uc0\u55356 \u57289 -\f1 \\ud83c\\udfc9 rugby football\ - -\f0 \uc0\u55356 \u57316 -\f1 \\ud83c\\udfe4 european post office\ - -\f0 \uc0\u55357 \u56320 -\f1 \\ud83d\\udc00 rat\ - -\f0 \uc0\u55357 \u56321 -\f1 \\ud83d\\udc01 mouse\ - -\f0 \uc0\u55357 \u56322 -\f1 \\ud83d\\udc02 ox\ - -\f0 \uc0\u55357 \u56323 -\f1 \\ud83d\\udc03 water buffalo\ - -\f0 \uc0\u55357 \u56324 -\f1 \\ud83d\\udc04 cow\ - -\f0 \uc0\u55357 \u56325 -\f1 \\ud83d\\udc05 tiger\ - -\f0 \uc0\u55357 \u56326 -\f1 \\ud83d\\udc06 leopard\ - -\f0 \uc0\u55357 \u56327 -\f1 \\ud83d\\udc07 rabbit\ - -\f0 \uc0\u55357 \u56328 -\f1 \\ud83d\\udc08 cat\ - -\f0 \uc0\u55357 \u56329 -\f1 \\ud83d\\udc09 dragon\ - -\f0 \uc0\u55357 \u56330 -\f1 \\ud83d\\udc0a crocodile\ - -\f0 \uc0\u55357 \u56331 -\f1 \\ud83d\\udc0b whale\ - -\f0 \uc0\u55357 \u56335 -\f1 \\ud83d\\udc0f ram\ - -\f0 \uc0\u55357 \u56336 -\f1 \\ud83d\\udc10 goat\ - -\f0 \uc0\u55357 \u56339 -\f1 \\ud83d\\udc13 rooster\ - -\f0 \uc0\u55357 \u56341 -\f1 \\ud83d\\udc15 dog\ - -\f0 \uc0\u55357 \u56342 -\f1 \\ud83d\\udc16 pig\ - -\f0 \uc0\u55357 \u56362 -\f1 \\ud83d\\udc2a dromedary camel\ - -\f0 \uc0\u55357 \u56421 -\f1 \\ud83d\\udc65 busts in silhouette\ - -\f0 \uc0\u55357 \u56428 -\f1 \\ud83d\\udc6c two men holding hands\ - -\f0 \uc0\u55357 \u56429 -\f1 \\ud83d\\udc6d two women holding hands\ - -\f0 \uc0\u55357 \u56493 -\f1 \\ud83d\\udcad thought balloon\ - -\f0 \uc0\u55357 \u56502 -\f1 \\ud83d\\udcb6 banknote with euro sign\ - -\f0 \uc0\u55357 \u56503 -\f1 \\ud83d\\udcb7 banknote with pound sign\ - -\f0 \uc0\u55357 \u56556 -\f1 \\ud83d\\udcec open mailbox with raised flag\ - -\f0 \uc0\u55357 \u56557 -\f1 \\ud83d\\udced open mailbox with lowered flag\ - -\f0 \uc0\u55357 \u56559 -\f1 \\ud83d\\udcef postal horn\ - -\f0 \uc0\u55357 \u56565 -\f1 \\ud83d\\udcf5 no mobile phones\ - -\f0 \uc0\u55357 \u56576 -\f1 \\ud83d\\udd00 twisted rightwards arrows\ - -\f0 \uc0\u55357 \u56577 -\f1 \\ud83d\\udd01 clockwise rightwards and leftwards open circle arrows\ - -\f0 \uc0\u55357 \u56578 -\f1 \\ud83d\\udd02 clockwise rightwards and leftwards open circle arrows with circled one overlay\ - -\f0 \uc0\u55357 \u56580 -\f1 \\ud83d\\udd04 anticlockwise downwards and upwards open circle arrows\ - -\f0 \uc0\u55357 \u56581 -\f1 \\ud83d\\udd05 low brightness symbol\ - -\f0 \uc0\u55357 \u56582 -\f1 \\ud83d\\udd06 high brightness symbol\ - -\f0 \uc0\u55357 \u56583 -\f1 \\ud83d\\udd07 speaker with cancellation stroke\ - -\f0 \uc0\u55357 \u56585 -\f1 \\ud83d\\udd09 speaker with one sound wave\ - -\f0 \uc0\u55357 \u56597 -\f1 \\ud83d\\udd15 bell with cancellation stroke\ - -\f0 \uc0\u55357 \u56620 -\f1 \\ud83d\\udd2c microscope\ - -\f0 \uc0\u55357 \u56621 -\f1 \\ud83d\\udd2d telescope\ - -\f0 \uc0\u55357 \u56668 -\f1 \\ud83d\\udd5c clock face one-thirty\ - -\f0 \uc0\u55357 \u56669 -\f1 \\ud83d\\udd5d clock face two-thirty\ - -\f0 \uc0\u55357 \u56670 -\f1 \\ud83d\\udd5e clock face three-thirty\ - -\f0 \uc0\u55357 \u56671 -\f1 \\ud83d\\udd5f clock face four-thirty\ - -\f0 \uc0\u55357 \u56672 -\f1 \\ud83d\\udd60 clock face five-thirty\ - -\f0 \uc0\u55357 \u56673 -\f1 \\ud83d\\udd61 clock face six-thirty\ - -\f0 \uc0\u55357 \u56674 -\f1 \\ud83d\\udd62 clock face seven-thirty\ - -\f0 \uc0\u55357 \u56675 -\f1 \\ud83d\\udd63 clock face eight-thirty\ - -\f0 \uc0\u55357 \u56676 -\f1 \\ud83d\\udd64 clock face nine-thirty\ - -\f0 \uc0\u55357 \u56677 -\f1 \\ud83d\\udd65 clock face ten-thirty\ - -\f0 \uc0\u55357 \u56678 -\f1 \\ud83d\\udd66 clock face eleven-thirty\ - -\f0 \uc0\u55357 \u56679 -\f1 \\ud83d\\udd67 clock face twelve-thirty} \ No newline at end of file diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 00000000..947a3de0 Binary files /dev/null and b/assets/favicon.ico differ diff --git a/src/style/font/fontawesome-webfont.eot b/assets/font/fontawesome-webfont.eot old mode 100755 new mode 100644 similarity index 100% rename from src/style/font/fontawesome-webfont.eot rename to assets/font/fontawesome-webfont.eot diff --git a/src/style/font/fontawesome-webfont.svg b/assets/font/fontawesome-webfont.svg old mode 100755 new mode 100644 similarity index 100% rename from src/style/font/fontawesome-webfont.svg rename to assets/font/fontawesome-webfont.svg diff --git a/src/style/font/fontawesome-webfont.ttf b/assets/font/fontawesome-webfont.ttf old mode 100755 new mode 100644 similarity index 100% rename from src/style/font/fontawesome-webfont.ttf rename to assets/font/fontawesome-webfont.ttf diff --git a/src/style/font/fontawesome-webfont.woff b/assets/font/fontawesome-webfont.woff old mode 100755 new mode 100644 similarity index 100% rename from src/style/font/fontawesome-webfont.woff rename to assets/font/fontawesome-webfont.woff diff --git a/assets/forkme_right_darkblue_121621.png b/assets/forkme_right_darkblue_121621.png deleted file mode 100644 index 146ef8a8..00000000 Binary files a/assets/forkme_right_darkblue_121621.png and /dev/null differ diff --git a/checkgit.sh b/checkgit.sh new file mode 100755 index 00000000..ee29eb4b --- /dev/null +++ b/checkgit.sh @@ -0,0 +1,6 @@ +GIT_STATUS=$(git status --porcelain | wc -l ) +if [[ GIT_STATUS -ne 0 ]]; then + echo "${1:-Source files were modified}" + git status + exit $GIT_STATUS +fi; diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 00000000..c263f85a --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,213 @@ +var { execSync } = require('child_process'); +var { writeFileSync, readdirSync, readFileSync } = require('fs'); + +var glob = require('glob'); +var _ = require('underscore'); + +var { src, dest, series, watch } = require('gulp'); +var log = require('fancy-log'); +var gHash = require('gulp-hash'); +var gClean = require('gulp-clean'); +var concat = require('gulp-concat'); +var cleanCSS = require('gulp-clean-css'); +var gTerser = require('gulp-terser'); +var gJasmine = require('gulp-jasmine'); +var { minify } = require('html-minifier'); +var { SpecReporter } = require('jasmine-spec-reporter'); +var gJshint = require('gulp-jshint'); + +var source = require('vinyl-source-stream'); +var buffer = require('vinyl-buffer'); +var browserify = require('browserify'); +var babelify = require('babelify'); + +_.templateSettings.interpolate = /\{\{(.+?)\}\}/g; +_.templateSettings.escape = /\{\{\{(.*?)\}\}\}/g; +_.templateSettings.evaluate = /\{\{-(.*?)\}\}/g; + +// precompile for speed +var indexFile = readFileSync('src/template.index.html').toString(); +var indexTemplate = _.template(indexFile); + +var compliments = [ + 'Thanks to Hongarc for the modern and amazing gulp workflow!', + 'I hope you all have a great day :)' +]; +var compliment = (done) => { + var index = Math.floor(Math.random() * compliments.length); + + log(compliments[index]); + done(); +}; + +const lintStrings = (done) => { + execSync('node src/js/intl/checkStrings'); + done(); +}; + + +var destDir = './build/'; + +var buildIndex = function(done) { + log('Building index...'); + + // first find the one in here that we want + var buildFiles = readdirSync(destDir); + + var jsRegex = /bundle-[\.\w]+\.js/; + var jsFile = buildFiles.find(function(name) { + return jsRegex.exec(name); + }); + if (!jsFile) { + throw new Error('no hashed min file found!'); + } + log('Found hashed js file: ' + jsFile); + + var styleRegex = /main-[\.\w]+\.css/; + var styleFile = buildFiles.find(function(name) { + return styleRegex.exec(name); + }); + if (!styleFile) { + throw new Error('no hashed css file found!'); + } + log('Found hashed style file: ' + styleFile); + + // output these filenames to our index template + var outputIndex = indexTemplate({ + jsFile, + styleFile, + }); + + if (process.env.NODE_ENV === 'production') { + outputIndex = minify(outputIndex, { + minifyJS: true, + collapseWhitespace: true, + processScripts: ['text/html'], + removeComments: true, + }); + } + writeFileSync('index.html', outputIndex); + done(); +}; + +var getBundle = function() { + return browserify({ + entries: [...glob.sync('src/**/*.js'), ...glob.sync('src/**/*.jsx')], + debug: true, + }) + .transform(babelify, { presets: ['@babel/preset-react'] }) + .bundle() + .pipe(source('bundle.js')) + .pipe(buffer()) + .pipe(gHash()); +}; + +var clean = function () { + return src(destDir, { read: false, allowEmpty: true }) + .pipe(gClean()); +}; + +var jshint = function() { + return src([ + 'gulpfile.js', + '__tests__/', + 'src/' + ]) + .pipe(gJshint()) + .pipe(gJshint.reporter('default')); +}; + +var ifyBuild = function() { + return getBundle() + .pipe(dest(destDir)); +}; + +var miniBuild = function() { + process.env.NODE_ENV = 'production'; + return getBundle() + .pipe(gTerser()) + .pipe(dest(destDir)); +}; + +var style = function() { + var chain = src('src/style/*.css') + .pipe(concat('main.css')); + + if (process.env.NODE_ENV === 'production') { + chain = chain.pipe(cleanCSS()); + } + + return chain.pipe(gHash()) + .pipe(dest(destDir)); +}; + +var jasmine = function() { + return src('__tests__/*.spec.js') + .pipe(gJasmine({ + config: { + verbose: true, + random: false, + }, + reporter: new SpecReporter(), + })); +}; + +var gitAdd = function(done) { + execSync('git add build/'); + done(); +}; + +var gitDeployMergeMaster = function(done) { + execSync('git checkout gh-pages && git merge master -m "merge master"'); + done(); +}; + +var gitDeployPushOrigin = function(done) { + execSync('git commit -am "rebuild for prod"; ' + + 'git push origin gh-pages --force && ' + + 'git branch -f trunk gh-pages && ' + + 'git checkout master' + ); + done(); +}; + +var fastBuild = series(clean, ifyBuild, style, buildIndex, jshint); + +var build = series( + clean, + miniBuild, style, buildIndex, + gitAdd, jasmine, jshint, + lintStrings, compliment +); + +var deploy = series( + clean, + jasmine, + jshint, + gitDeployMergeMaster, + build, + gitDeployPushOrigin, + compliment +); + +var lint = series(jshint, compliment); + +var watching = function() { + return watch([ + 'gulpfile.js', + '__tests__/git.spec.js', + 'src/js/**/*.js', + 'src/js/**/**/*.js', + 'src/levels/**/*.js' + ], series([fastBuild , jasmine, jshint, lintStrings])); +}; + +module.exports = { + default: build, + lint, + fastBuild, + watching, + build, + test: jasmine, + deploy, +}; diff --git a/lib/es5-shim.min.js b/lib/es5-shim.min.js deleted file mode 100644 index de26bb58..00000000 --- a/lib/es5-shim.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * https://github.com/es-shims/es5-shim - * @license es5-shim Copyright 2009-2015 by contributors, MIT License - * see https://github.com/es-shims/es5-shim/blob/v4.1.1/LICENSE - */ -(function(t,e){"use strict";if(typeof define==="function"&&define.amd){define(e)}else if(typeof exports==="object"){module.exports=e()}else{t.returnExports=e()}})(this,function(){var t=Array.prototype;var e=Object.prototype;var r=Function.prototype;var n=String.prototype;var i=Number.prototype;var a=t.slice;var o=t.splice;var u=t.push;var l=t.unshift;var f=r.call;var s=e.toString;var c=Array.isArray||function gt(t){return s.call(t)==="[object Array]"};var p=typeof Symbol==="function"&&typeof Symbol.toStringTag==="symbol";var h;var v=Function.prototype.toString,g=function yt(t){try{v.call(t);return true}catch(e){return false}},y="[object Function]",d="[object GeneratorFunction]";h=function dt(t){if(typeof t!=="function"){return false}if(p){return g(t)}var e=s.call(t);return e===y||e===d};var m;var b=RegExp.prototype.exec,w=function mt(t){try{b.call(t);return true}catch(e){return false}},T="[object RegExp]";m=function bt(t){if(typeof t!=="object"){return false}return p?w(t):s.call(t)===T};var x;var O=String.prototype.valueOf,j=function wt(t){try{O.call(t);return true}catch(e){return false}},S="[object String]";x=function Tt(t){if(typeof t==="string"){return true}if(typeof t!=="object"){return false}return p?j(t):s.call(t)===S};var E=function xt(t){var e=s.call(t);var r=e==="[object Arguments]";if(!r){r=!c(t)&&t!==null&&typeof t==="object"&&typeof t.length==="number"&&t.length>=0&&h(t.callee)}return r};var N=function(t){var e=Object.defineProperty&&function(){try{Object.defineProperty({},"x",{});return true}catch(t){return false}}();var r;if(e){r=function(t,e,r,n){if(!n&&e in t){return}Object.defineProperty(t,e,{configurable:true,enumerable:false,writable:true,value:r})}}else{r=function(t,e,r,n){if(!n&&e in t){return}t[e]=r}}return function n(e,i,a){for(var o in i){if(t.call(i,o)){r(e,o,i[o],a)}}}}(e.hasOwnProperty);function I(t){var e=typeof t;return t===null||e==="undefined"||e==="boolean"||e==="number"||e==="string"}var D={ToInteger:function Ot(t){var e=+t;if(e!==e){e=0}else if(e!==0&&e!==1/0&&e!==-(1/0)){e=(e>0||-1)*Math.floor(Math.abs(e))}return e},ToPrimitive:function jt(t){var e,r,n;if(I(t)){return t}r=t.valueOf;if(h(r)){e=r.call(t);if(I(e)){return e}}n=t.toString;if(h(n)){e=n.call(t);if(I(e)){return e}}throw new TypeError},ToObject:function(t){if(t==null){throw new TypeError("can't convert "+t+" to object")}return Object(t)},ToUint32:function St(t){return t>>>0}};var M=function Et(){};N(r,{bind:function Nt(t){var e=this;if(!h(e)){throw new TypeError("Function.prototype.bind called on incompatible "+e)}var r=a.call(arguments,1);var n;var i=function(){if(this instanceof n){var i=e.apply(this,r.concat(a.call(arguments)));if(Object(i)===i){return i}return this}else{return e.apply(t,r.concat(a.call(arguments)))}};var o=Math.max(0,e.length-r.length);var u=[];for(var l=0;l0&&typeof e!=="number"){r=a.call(arguments);if(r.length<2){r.push(this.length-t)}else{r[1]=D.ToInteger(e)}}return o.apply(this,r)}},!U);var k=[].unshift(0)!==1;N(t,{unshift:function(){l.apply(this,arguments);return this.length}},k);N(Array,{isArray:c});var A=Object("a");var C=A[0]!=="a"||!(0 in A);var P=function Mt(t){var e=true;var r=true;if(t){t.call("foo",function(t,r,n){if(typeof n!=="object"){e=false}});t.call([1],function(){"use strict";r=typeof this==="string"},"x")}return!!t&&e&&r};N(t,{forEach:function Ft(t){var e=D.ToObject(this),r=C&&x(this)?this.split(""):e,n=arguments[1],i=-1,a=r.length>>>0;if(!h(t)){throw new TypeError}while(++i>>0,i=Array(n),a=arguments[1];if(!h(t)){throw new TypeError(t+" is not a function")}for(var o=0;o>>0,i=[],a,o=arguments[1];if(!h(t)){throw new TypeError(t+" is not a function")}for(var u=0;u>>0,i=arguments[1];if(!h(t)){throw new TypeError(t+" is not a function")}for(var a=0;a>>0,i=arguments[1];if(!h(t)){throw new TypeError(t+" is not a function")}for(var a=0;a>>0;if(!h(t)){throw new TypeError(t+" is not a function")}if(!n&&arguments.length===1){throw new TypeError("reduce of empty array with no initial value")}var i=0;var a;if(arguments.length>=2){a=arguments[1]}else{do{if(i in r){a=r[i++];break}if(++i>=n){throw new TypeError("reduce of empty array with no initial value")}}while(true)}for(;i>>0;if(!h(t)){throw new TypeError(t+" is not a function")}if(!n&&arguments.length===1){throw new TypeError("reduceRight of empty array with no initial value")}var i,a=n-1;if(arguments.length>=2){i=arguments[1]}else{do{if(a in r){i=r[a--];break}if(--a<0){throw new TypeError("reduceRight of empty array with no initial value")}}while(true)}if(a<0){return i}do{if(a in r){i=t.call(void 0,i,r[a],a,e)}}while(a--);return i}},!J);var z=Array.prototype.indexOf&&[0,1].indexOf(1,2)!==-1;N(t,{indexOf:function Zt(t){var e=C&&x(this)?this.split(""):D.ToObject(this),r=e.length>>>0;if(!r){return-1}var n=0;if(arguments.length>1){n=D.ToInteger(arguments[1])}n=n>=0?n:Math.max(0,r+n);for(;n>>0;if(!r){return-1}var n=r-1;if(arguments.length>1){n=Math.min(n,D.ToInteger(arguments[1]))}n=n>=0?n:r-Math.abs(n);for(;n>=0;n--){if(n in e&&t===e[n]){return n}}return-1}},$);var B=!{toString:null}.propertyIsEnumerable("toString"),G=function(){}.propertyIsEnumerable("prototype"),H=!F("x","0"),L=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],X=L.length;N(Object,{keys:function zt(t){var e=h(t),r=E(t),n=t!==null&&typeof t==="object",i=n&&x(t);if(!n&&!e&&!r){throw new TypeError("Object.keys called on a non-object")}var a=[];var o=G&&e;if(i&&H||r){for(var u=0;u9999?"+":"")+("00000"+Math.abs(n)).slice(0<=n&&n<=9999?-4:-6);e=t.length;while(e--){r=t[e];if(r<10){t[e]="0"+r}}return n+"-"+t.slice(0,2).join("-")+"T"+t.slice(2).join(":")+"."+("000"+this.getUTCMilliseconds()).slice(-3)+"Z"}},V);var W=function(){try{return Date.prototype.toJSON&&new Date(NaN).toJSON()===null&&new Date(K).toJSON().indexOf(Q)!==-1&&Date.prototype.toJSON.call({toISOString:function(){return true}})}catch(t){return false}}();if(!W){Date.prototype.toJSON=function Gt(t){var e=Object(this);var r=D.ToPrimitive(e);if(typeof r==="number"&&!isFinite(r)){return null}var n=e.toISOString;if(!h(n)){throw new TypeError("toISOString property is not callable")}return n.call(e)}}var _=Date.parse("+033658-09-27T01:46:40.000Z")===1e15;var tt=!isNaN(Date.parse("2012-04-04T24:00:00.500Z"))||!isNaN(Date.parse("2012-11-31T23:59:59.000Z"));var et=isNaN(Date.parse("2000-01-01T00:00:00.000Z"));if(!Date.parse||et||tt||!_){Date=function(t){function e(r,n,i,a,o,u,l){var f=arguments.length;if(this instanceof t){var s=f===1&&String(r)===r?new t(e.parse(r)):f>=7?new t(r,n,i,a,o,u,l):f>=6?new t(r,n,i,a,o,u):f>=5?new t(r,n,i,a,o):f>=4?new t(r,n,i,a):f>=3?new t(r,n,i):f>=2?new t(r,n):f>=1?new t(r):new t;N(s,{constructor:e},true);return s}return t.apply(this,arguments)}var r=new RegExp("^"+"(\\d{4}|[+-]\\d{6})"+"(?:-(\\d{2})"+"(?:-(\\d{2})"+"(?:"+"T(\\d{2})"+":(\\d{2})"+"(?:"+":(\\d{2})"+"(?:(\\.\\d{1,}))?"+")?"+"("+"Z|"+"(?:"+"([-+])"+"(\\d{2})"+":(\\d{2})"+")"+")?)?)?)?"+"$");var n=[0,31,59,90,120,151,181,212,243,273,304,334,365];function i(t,e){var r=e>1?1:0;return n[e]+Math.floor((t-1969+r)/4)-Math.floor((t-1901+r)/100)+Math.floor((t-1601+r)/400)+365*(t-1970)}function a(e){return Number(new t(1970,0,1,0,0,0,e))}for(var o in t){e[o]=t[o]}e.now=t.now;e.UTC=t.UTC;e.prototype=t.prototype;e.prototype.constructor=e;e.parse=function u(e){var n=r.exec(e);if(n){var o=Number(n[1]),u=Number(n[2]||1)-1,l=Number(n[3]||1)-1,f=Number(n[4]||0),s=Number(n[5]||0),c=Number(n[6]||0),p=Math.floor(Number(n[7]||0)*1e3),h=Boolean(n[4]&&!n[8]),v=n[9]==="-"?1:-1,g=Number(n[10]||0),y=Number(n[11]||0),d;if(f<(s>0||c>0||p>0?24:25)&&s<60&&c<60&&p<1e3&&u>-1&&u<12&&g<24&&y<60&&l>-1&&l=0){r+=nt.data[e];nt.data[e]=Math.floor(r/t);r=r%t*nt.base}},numToString:function Yt(){var t=nt.size;var e="";while(--t>=0){if(e!==""||t===0||nt.data[t]!==0){var r=String(nt.data[t]);if(e===""){e=r}else{e+="0000000".slice(0,7-r.length)+r}}}return e},pow:function qt(t,e,r){return e===0?r:e%2===1?qt(t,e-1,r*t):qt(t*t,e/2,r)},log:function Kt(t){var e=0;var r=t;while(r>=4096){e+=12;r/=4096}while(r>=2){e+=1;r/=2}return e}};N(i,{toFixed:function Qt(t){var e,r,n,i,a,o,u,l;e=Number(t);e=e!==e?0:Math.floor(e);if(e<0||e>20){throw new RangeError("Number.toFixed called with invalid number of decimals")}r=Number(this);if(r!==r){return"NaN"}if(r<=-1e21||r>=1e21){return String(r)}n="";if(r<0){n="-";r=-r}i="0";if(r>1e-21){a=nt.log(r*nt.pow(2,69,1))-69;o=a<0?r*nt.pow(2,-a,1):r/nt.pow(2,a,1);o*=4503599627370496;a=52-a;if(a>0){nt.multiply(0,o);u=e;while(u>=7){nt.multiply(1e7,0);u-=7}nt.multiply(nt.pow(10,u,1),0);u=a-1;while(u>=23){nt.divide(1<<23);u-=23}nt.divide(1<0){l=i.length;if(l<=e){i=n+"0.0000000000000000000".slice(0,e-l+2)+i}else{i=n+i.slice(0,l-e)+"."+i.slice(l-e)}}else{i=n+i}return i}},rt);var it=n.split;if("ab".split(/(?:ab)*/).length!==2||".".split(/(.?)(.?)/).length!==4||"tesst".split(/(s)*/)[1]==="t"||"test".split(/(?:)/,-1).length!==4||"".split(/.?/).length||".".split(/()()/).length>1){(function(){var t=typeof/()??/.exec("")[1]==="undefined";n.split=function(e,r){var n=this;if(typeof e==="undefined"&&r===0){return[]}if(!m(e)){return it.call(this,e,r)}var i=[];var a=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.extended?"x":"")+(e.sticky?"y":""),o=0,l,f,s,c;var p=new RegExp(e.source,a+"g");n+="";if(!t){l=new RegExp("^"+p.source+"$(?!\\s)",a)}var h=typeof r==="undefined"?-1>>>0:D.ToUint32(r);f=p.exec(n);while(f){s=f.index+f[0].length;if(s>o){i.push(n.slice(o,f.index));if(!t&&f.length>1){f[0].replace(l,function(){for(var t=1;t1&&f.index=h){break}}if(p.lastIndex===f.index){p.lastIndex++}f=p.exec(n)}if(o===n.length){if(c||!p.test("")){i.push("")}}else{i.push(n.slice(o))}return i.length>h?i.slice(0,h):i}})()}else if("0".split(void 0,0).length){n.split=function Vt(t,e){if(typeof t==="undefined"&&e===0){return[]}return it.call(this,t,e)}}var at=n.replace;var ot=function(){var t=[];"x".replace(/x(.)?/g,function(e,r){t.push(r)});return t.length===1&&typeof t[0]==="undefined"}();if(!ot){n.replace=function Wt(t,e){var r=h(e);var n=m(t)&&/\)[*?]/.test(t.source);if(!r||!n){return at.call(this,t,e)}else{var i=function(r){var n=arguments.length;var i=t.lastIndex;t.lastIndex=0;var a=t.exec(r)||[];t.lastIndex=i;a.push(arguments[n-2],arguments[n-1]);return e.apply(this,a)};return at.call(this,t,i)}}}var ut=n.substr;var lt="".substr&&"0b".substr(-1)!=="b";N(n,{substr:function _t(t,e){var r=t;if(t<0){r=Math.max(this.length+t,0)}return ut.call(this,r,e)}},lt);var ft=" \n\f\r \xa0\u1680\u180e\u2000\u2001\u2002\u2003"+"\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028"+"\u2029\ufeff";var st="\u200b";var ct="["+ft+"]";var pt=new RegExp("^"+ct+ct+"*");var ht=new RegExp(ct+ct+"*$");var vt=n.trim&&(ft.trim()||!st.trim());N(n,{trim:function te(){if(typeof this==="undefined"||this===null){throw new TypeError("can't convert "+this+" to object")}return String(this).replace(pt,"").replace(ht,"")}},vt);if(parseInt(ft+"08")!==8||parseInt(ft+"0x16")!==22){parseInt=function(t){var e=/^0[xX]/;return function r(n,i){var a=String(n).trim();var o=Number(i)||(e.test(a)?16:10);return t(a,o)}}(parseInt)}}); -//# sourceMappingURL=es5-shim.map \ No newline at end of file diff --git a/lib/jquery-1.8.0.min.js b/lib/jquery-1.8.0.min.js deleted file mode 100644 index f121291c..00000000 --- a/lib/jquery-1.8.0.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v@1.8.0 jquery.com | jquery.org/license */ -(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write(""),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bR[a]=c,c}function ch(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||cd.test(a)?d(a,e):ch(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ch(a+"["+e+"]",b[e],c,d);else d(a,b)}function cy(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.0",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return typeof a=="object"?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;ba",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length||!d)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="t",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/^(?:\{.*\}|\[.*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||++p.uuid:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.shift(),e=p._queueHooks(a,b),f=function(){p.dequeue(a,b)};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),delete e.stop,d.call(a,f,e)),!c.length&&e&&e.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c-1)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c-1)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,""+d),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;jq&&u.push({elem:this,matches:o.slice(q)});for(d=0;d0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bd(a,b,c,d){var e=0,f=b.length;for(;e0?h(g,c,f):[]}function bf(a,c,d,e,f){var g,h,i,j,k,l,m,n,p=0,q=f.length,s=L.POS,t=new RegExp("^"+s.source+"(?!"+r+")","i"),u=function(){var a=1,c=arguments.length-2;for(;ai){m=a.slice(i,g.index),i=n,l=[c],B.test(m)&&(k&&(l=k),k=e);if(h=H.test(m))m=m.slice(0,-5).replace(B,"$&*");g.length>1&&g[0].replace(t,u),k=be(m,g[1],g[2],l,k,h)}}k?(j=j.concat(k),(m=a.slice(i))&&m!==")"?B.test(m)?bd(m,j,d,e):Z(m,c,d,e?e.concat(k):k):o.apply(d,j)):Z(a,c,d,e)}return q===1?d:Z.uniqueSort(d)}function bg(a,b,c){var d,e,f,g=[],i=0,j=D.exec(a),k=!j.pop()&&!j.pop(),l=k&&a.match(C)||[""],m=$.preFilter,n=$.filter,o=!c&&b!==h;for(;(e=l[i])!=null&&k;i++){g.push(d=[]),o&&(e=" "+e);while(e){k=!1;if(j=B.exec(e))e=e.slice(j[0].length),k=d.push({part:j.pop().replace(A," "),captures:j});for(f in n)(j=L[f].exec(e))&&(!m[f]||(j=m[f](j,b,c)))&&(e=e.slice(j.shift().length),k=d.push({part:f,captures:j}));if(!k)break}}return k||Z.error(a),g}function bh(a,b,e){var f=b.dir,g=m++;return a||(a=function(a){return a===e}),b.first?function(b,c){while(b=b[f])if(b.nodeType===1)return a(b,c)&&b}:function(b,e){var h,i=g+"."+d,j=i+"."+c;while(b=b[f])if(b.nodeType===1){if((h=b[q])===j)return b.sizset;if(typeof h=="string"&&h.indexOf(i)===0){if(b.sizset)return b}else{b[q]=j;if(a(b,e))return b.sizset=!0,b;b.sizset=!1}}}}function bi(a,b){return a?function(c,d){var e=b(c,d);return e&&a(e===!0?c:e,d)}:b}function bj(a,b,c){var d,e,f=0;for(;d=a[f];f++)$.relative[d.part]?e=bh(e,$.relative[d.part],b):(d.captures.push(b,c),e=bi(e,$.filter[d.part].apply(null,d.captures)));return e}function bk(a){return function(b,c){var d,e=0;for(;d=a[e];e++)if(d(b,c))return!0;return!1}}var c,d,e,f,g,h=a.document,i=h.documentElement,j="undefined",k=!1,l=!0,m=0,n=[].slice,o=[].push,q=("sizcache"+Math.random()).replace(".",""),r="[\\x20\\t\\r\\n\\f]",s="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",t=s.replace("w","w#"),u="([*^$|!~]?=)",v="\\["+r+"*("+s+")"+r+"*(?:"+u+r+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+t+")|)|)"+r+"*\\]",w=":("+s+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|((?:[^,]|\\\\,|(?:,(?=[^\\[]*\\]))|(?:,(?=[^\\(]*\\))))*))\\)|)",x=":(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\)|)(?=[^-]|$)",y=r+"*([\\x20\\t\\r\\n\\f>+~])"+r+"*",z="(?=[^\\x20\\t\\r\\n\\f])(?:\\\\.|"+v+"|"+w.replace(2,7)+"|[^\\\\(),])+",A=new RegExp("^"+r+"+|((?:^|[^\\\\])(?:\\\\.)*)"+r+"+$","g"),B=new RegExp("^"+y),C=new RegExp(z+"?(?="+r+"*,|$)","g"),D=new RegExp("^(?:(?!,)(?:(?:^|,)"+r+"*"+z+")*?|"+r+"*(.*?))(\\)|$)"),E=new RegExp(z.slice(19,-6)+"\\x20\\t\\r\\n\\f>+~])+|"+y,"g"),F=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,G=/[\x20\t\r\n\f]*[+~]/,H=/:not\($/,I=/h\d/i,J=/input|select|textarea|button/i,K=/\\(?!\\)/g,L={ID:new RegExp("^#("+s+")"),CLASS:new RegExp("^\\.("+s+")"),NAME:new RegExp("^\\[name=['\"]?("+s+")['\"]?\\]"),TAG:new RegExp("^("+s.replace("[-","[-\\*")+")"),ATTR:new RegExp("^"+v),PSEUDO:new RegExp("^"+w),CHILD:new RegExp("^:(only|nth|last|first)-child(?:\\("+r+"*(even|odd|(([+-]|)(\\d*)n|)"+r+"*(?:([+-]|)"+r+"*(\\d+)|))"+r+"*\\)|)","i"),POS:new RegExp(x,"ig"),needsContext:new RegExp("^"+r+"*[>+~]|"+x,"i")},M={},N=[],O={},P=[],Q=function(a){return a.sizzleFilter=!0,a},R=function(a){return function(b){return b.nodeName.toLowerCase()==="input"&&b.type===a}},S=function(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}},T=function(a){var b=!1,c=h.createElement("div");try{b=a(c)}catch(d){}return c=null,b},U=T(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),V=T(function(a){a.id=q+0,a.innerHTML="",i.insertBefore(a,i.firstChild);var b=h.getElementsByName&&h.getElementsByName(q).length===2+h.getElementsByName(q+0).length;return g=!h.getElementById(q),i.removeChild(a),b}),W=T(function(a){return a.appendChild(h.createComment("")),a.getElementsByTagName("*").length===0}),X=T(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==j&&a.firstChild.getAttribute("href")==="#"}),Y=T(function(a){return a.innerHTML="",!a.getElementsByClassName||a.getElementsByClassName("e").length===0?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length!==1)}),Z=function(a,b,c,d){c=c||[],b=b||h;var e,f,g,i,j=b.nodeType;if(j!==1&&j!==9)return[];if(!a||typeof a!="string")return c;g=ba(b);if(!g&&!d)if(e=F.exec(a))if(i=e[1]){if(j===9){f=b.getElementById(i);if(!f||!f.parentNode)return c;if(f.id===i)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(i))&&bb(b,f)&&f.id===i)return c.push(f),c}else{if(e[2])return o.apply(c,n.call(b.getElementsByTagName(a),0)),c;if((i=e[3])&&Y&&b.getElementsByClassName)return o.apply(c,n.call(b.getElementsByClassName(i),0)),c}return bm(a,b,c,d,g)},$=Z.selectors={cacheLength:50,match:L,order:["ID","TAG"],attrHandle:{},createPseudo:Q,find:{ID:g?function(a,b,c){if(typeof b.getElementById!==j&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==j&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==j&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:W?function(a,b){if(typeof b.getElementsByTagName!==j)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(K,""),a[3]=(a[4]||a[5]||"").replace(K,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||Z.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&Z.error(a[0]),a},PSEUDO:function(a){var b,c=a[4];return L.CHILD.test(a[0])?null:(c&&(b=D.exec(c))&&b.pop()&&(a[0]=a[0].slice(0,b[0].length-c.length-1),c=b[0].slice(0,-1)),a.splice(2,3,c||a[3]),a)}},filter:{ID:g?function(a){return a=a.replace(K,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(K,""),function(b){var c=typeof b.getAttributeNode!==j&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(K,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=M[a];return b||(b=M[a]=new RegExp("(^|"+r+")"+a+"("+r+"|$)"),N.push(a),N.length>$.cacheLength&&delete M[N.shift()]),function(a){return b.test(a.className||typeof a.getAttribute!==j&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return b?function(d){var e=Z.attr(d,a),f=e+"";if(e==null)return b==="!=";switch(b){case"=":return f===c;case"!=":return f!==c;case"^=":return c&&f.indexOf(c)===0;case"*=":return c&&f.indexOf(c)>-1;case"$=":return c&&f.substr(f.length-c.length)===c;case"~=":return(" "+f+" ").indexOf(c)>-1;case"|=":return f===c||f.substr(0,c.length+1)===c+"-"}}:function(b){return Z.attr(b,a)!=null}},CHILD:function(a,b,c,d){if(a==="nth"){var e=m++;return function(a){var b,f,g=0,h=a;if(c===1&&d===0)return!0;b=a.parentNode;if(b&&(b[q]!==e||!a.sizset)){for(h=b.firstChild;h;h=h.nextSibling)if(h.nodeType===1){h.sizset=++g;if(h===a)break}b[q]=e}return f=a.sizset-d,c===0?f===0:f%c===0&&f/c>=0}}return function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b,c,d){var e=$.pseudos[a]||$.pseudos[a.toLowerCase()];return e||Z.error("unsupported pseudo: "+a),e.sizzleFilter?e(b,c,d):e}},pseudos:{not:Q(function(a,b,c){var d=bl(a.replace(A,"$1"),b,c);return function(a){return!d(a)}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!$.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},contains:Q(function(a){return function(b){return(b.textContent||b.innerText||bc(b)).indexOf(a)>-1}}),has:Q(function(a){return function(b){return Z(a,b).length>0}}),header:function(a){return I.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:R("radio"),checkbox:R("checkbox"),file:R("file"),password:R("password"),image:R("image"),submit:S("submit"),reset:S("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return J.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b,c){return c?a.slice(1):[a[0]]},last:function(a,b,c){var d=a.pop();return c?a:[d]},even:function(a,b,c){var d=[],e=c?1:0,f=a.length;for(;e$.cacheLength&&delete O[P.shift()],g};Z.matches=function(a,b){return Z(a,null,null,b)},Z.matchesSelector=function(a,b){return Z(b,null,null,[a]).length>0};var bm=function(a,b,e,f,g){a=a.replace(A,"$1");var h,i,j,k,l,m,p,q,r,s=a.match(C),t=a.match(E),u=b.nodeType;if(L.POS.test(a))return bf(a,b,e,f,s);if(f)h=n.call(f,0);else if(s&&s.length===1){if(t.length>1&&u===9&&!g&&(s=L.ID.exec(t[0]))){b=$.find.ID(s[1],b,g)[0];if(!b)return e;a=a.slice(t.shift().length)}q=(s=G.exec(t[0]))&&!s.index&&b.parentNode||b,r=t.pop(),m=r.split(":not")[0];for(j=0,k=$.order.length;j",a.querySelectorAll("[selected]").length||e.push("\\["+r+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),T(function(a){a.innerHTML="",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+r+"*(?:\"\"|'')"),a.innerHTML="",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=e.length&&new RegExp(e.join("|")),bm=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a)))if(d.nodeType===9)try{return o.apply(f,n.call(d.querySelectorAll(a),0)),f}catch(i){}else if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){var j=d.getAttribute("id"),k=j||q,l=G.test(a)&&d.parentNode||d;j?k=k.replace(c,"\\$&"):d.setAttribute("id",k);try{return o.apply(f,n.call(l.querySelectorAll(a.replace(C,"[id='"+k+"'] $&")),0)),f}catch(i){}finally{j||d.removeAttribute("id")}}return b(a,d,f,g,h)},g&&(T(function(b){a=g.call(b,"div");try{g.call(b,"[test!='']:sizzle"),f.push($.match.PSEUDO)}catch(c){}}),f=new RegExp(f.join("|")),Z.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!ba(b)&&!f.test(c)&&(!e||!e.test(c)))try{var h=g.call(b,c);if(h||a||b.document&&b.document.nodeType!==11)return h}catch(i){}return Z(c,null,null,[b]).length>0})}(),Z.attr=p.attr,p.find=Z,p.expr=Z.selectors,p.expr[":"]=p.expr.pseudos,p.unique=Z.uniqueSort,p.text=Z.getText,p.isXMLDoc=Z.isXML,p.contains=Z.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b0)for(e=d;e=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*\s*$/g,bz={option:[1,"",""],legend:[1,"",""],thead:[1,"",""],tr:[2,"",""],td:[3,"",""],col:[2,"",""],area:[1,"",""],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X",""]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1>$2>");try{for(;d1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=0,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(g=b===e&&bA;(h=a[s])!=null;s++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{g=g||bk(b),l=l||g.appendChild(b.createElement("div")),h=h.replace(bo,"<$1>$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]===""&&!m?l.childNodes:[];for(f=n.length-1;f>=0;--f)p.nodeName(n[f],"tbody")&&!n[f].childNodes.length&&n[f].parentNode.removeChild(n[f])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l=g.lastChild}h.nodeType?t.push(h):t=p.merge(t,h)}l&&(g.removeChild(l),h=l=g=null);if(!p.support.appendChecked)for(s=0;(h=t[s])!=null;s++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(s=0;(h=t[s])!=null;s++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[s+1,0].concat(r)),s+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^margin/,bO=new RegExp("^("+q+")(.*)$","i"),bP=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bQ=new RegExp("^([-+])=("+q+")","i"),bR={},bS={position:"absolute",visibility:"hidden",display:"block"},bT={letterSpacing:0,fontWeight:400,lineHeight:1},bU=["Top","Right","Bottom","Left"],bV=["Webkit","O","Moz","ms"],bW=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return bZ(this,!0)},hide:function(){return bZ(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bW.apply(this,arguments):this.each(function(){(c?a:bY(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bX(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bQ.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bX(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bT&&(f=bT[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(a,b){var c,d,e,f,g=getComputedStyle(a,null),h=a.style;return g&&(c=g[b],c===""&&!p.contains(a.ownerDocument.documentElement,a)&&(c=p.style(a,b)),bP.test(c)&&bN.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=c,c=g.width,h.width=d,h.minWidth=e,h.maxWidth=f)),c}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bP.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0||bH(a,"display")!=="none"?ca(a,b,d):p.swap(a,bS,function(){return ca(a,b,d)})},set:function(a,c,d){return b$(a,c,d?b_(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bP.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bU[d]+b]=e[d]||e[d-2]||e[0];return f}},bN.test(a)||(p.cssHooks[a+b].set=b$)});var cc=/%20/g,cd=/\[\]$/,ce=/\r?\n/g,cf=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,cg=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||cg.test(this.nodeName)||cf.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(ce,"\r\n")}}):{name:b.name,value:c.replace(ce,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ch(d,a[d],c,f);return e.join("&").replace(cc,"+")};var ci,cj,ck=/#.*$/,cl=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cm=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,cn=/^(?:GET|HEAD)$/,co=/^\/\//,cp=/\?/,cq=/ - - {{jsDependencies}} - - + - + + + + + + + This application simulates a git repository in your browser, so you will need + JS to use the app. Try enabling and refreshing the page -- Thanks! + + + + + + + + + + + + + + + + + + + + + + + + + + Learn Git Branching + + + + + + + + + + + + + + $ + + + + + + + + + + + + Git + + + Hg + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + Google analytics :-/ -->