summaryrefslogtreecommitdiff
path: root/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein
diff options
context:
space:
mode:
Diffstat (limited to 'tools/eslint/node_modules/optionator/node_modules/fast-levenshtein')
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/.npmignore4
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/.travis.yml16
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/CONTRIBUTING.md22
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/Gruntfile.js81
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/LICENSE.md25
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/README.md120
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/benchmark/speed.js182
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/bower.json30
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/levenshtein.js198
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/levenshtein.min.js2
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/package.json62
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/mocha.opts2
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/tests.js171
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/text1.txt1
-rw-r--r--tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/text2.txt1
15 files changed, 917 insertions, 0 deletions
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/.npmignore b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/.npmignore
new file mode 100644
index 0000000000..0cc2c66b8c
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/.npmignore
@@ -0,0 +1,4 @@
+*.iml
+.idea/
+node_modules/
+npm-debug.log
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/.travis.yml b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/.travis.yml
new file mode 100644
index 0000000000..cc060cb017
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/.travis.yml
@@ -0,0 +1,16 @@
+language: node_js
+
+node_js:
+ - 0.10
+ - 0.11
+
+before_script:
+ - "npm install -g grunt-cli"
+ - "npm install"
+
+script:
+ - "npm run build"
+
+notifications:
+ email:
+ - ram@hiddentao.com
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/CONTRIBUTING.md b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/CONTRIBUTING.md
new file mode 100644
index 0000000000..66626826d2
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/CONTRIBUTING.md
@@ -0,0 +1,22 @@
+# Contribute to fast-levenshtein
+
+This guide guidelines for those wishing to contribute to fast-levenshtein.
+
+## Contributor license agreement
+
+By submitting code as an individual or as an entity you agree that your code is [licensed the same as fast-levenshtein](https://github.com/hiddentao/fast-levenshtein/blob/master/LICENSE.md).
+
+## Issues and pull requests
+
+Issues and merge requests should be in English and contain appropriate language for audiences of all ages.
+
+We will only accept a merge requests which meets the following criteria:
+
+* Includes proper tests and all tests pass (unless it contains a test exposing a bug in existing code)
+* Can be merged without problems (if not please use: `git rebase master`)
+* Does not break any existing functionality
+* Fixes one specific issue or implements one specific feature (do not combine things, send separate merge requests if needed)
+* Keeps the code base clean and well structured
+* Contains functionality we think other users will benefit from too
+* Doesn't add unnessecary configuration options since they complicate future changes
+
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/Gruntfile.js b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/Gruntfile.js
new file mode 100644
index 0000000000..6e7b3b3707
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/Gruntfile.js
@@ -0,0 +1,81 @@
+module.exports = function(grunt) {
+
+ grunt.initConfig({
+ pkg: grunt.file.readJSON('package.json'),
+
+ mochaTest: {
+ files: ['test/*.js']
+ },
+ mochaTestConfig: {
+ options: {
+ reporter: 'spec',
+ ui: 'exports'
+ }
+ },
+
+ jshint: {
+ options: {
+ "bitwise": false,
+ "camelcase": false,
+ "curly": false,
+ "eqeqeq": true,
+ "forin": true,
+ "immed": true,
+ "indent": 2,
+ "latedef": false,
+ "newcap": true,
+ "noarg": true,
+ "noempty": false,
+ "nonew": true,
+ "plusplus": false,
+ "quotmark": false,
+ "undef": true,
+ "unused": true,
+ "strict": true,
+ "trailing": true,
+
+ "boss": true,
+ "laxcomma": true,
+ "multistr": true,
+ "sub": true,
+ "supernew": true,
+
+ "browser": true,
+ "node": true,
+ "worker": true,
+
+ "predef": [
+ 'define', 'require'
+ ]
+ },
+ files: ['levenshtein.js']
+ },
+
+ uglify: {
+ options: {
+ banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %>. Copyright <%= pkg.author %> */\n'
+ },
+ build: {
+ src: 'levenshtein.js',
+ dest: 'levenshtein.min.js'
+ }
+ },
+
+ benchmarkConfig: {
+ speed: {
+ src: ['benchmark/speed.js']
+ }
+ },
+ });
+
+ require('load-grunt-tasks')(grunt);
+ grunt.renameTask('benchmark', 'benchmarkConfig');
+
+ grunt.registerTask('build', ['jshint', 'uglify', 'mochaTest']);
+
+ grunt.registerTask('default', ['build']);
+
+ grunt.registerTask('benchmark', ['npm-install:levenshtein-edit-distance:levenshtein:natural:levenshtein-component:levenshtein-deltas', 'benchmarkConfig']);
+};
+
+
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/LICENSE.md b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/LICENSE.md
new file mode 100644
index 0000000000..6212406b41
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/LICENSE.md
@@ -0,0 +1,25 @@
+(MIT License)
+
+Copyright (c) 2013 [Ramesh Nair](http://www.hiddentao.com/)
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/README.md b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/README.md
new file mode 100644
index 0000000000..2a917a7318
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/README.md
@@ -0,0 +1,120 @@
+# fast-levenshtein - Levenshtein algorithm in Javascript
+
+[![Build Status](https://secure.travis-ci.org/hiddentao/fast-levenshtein.png)](http://travis-ci.org/hiddentao/fast-levenshtein)
+
+An efficient Javascript implementation of the [Levenshtein algorithm](http://en.wikipedia.org/wiki/Levenshtein_distance) with asynchronous callback support.
+
+## Features
+
+* Works in node.js and in the browser.
+* Better performance than other implementations by not needing to store the whole matrix ([more info](http://www.codeproject.com/Articles/13525/Fast-memory-efficient-Levenshtein-algorithm)).
+* Provides synchronous and asynchronous versions of the algorithm.
+* Asynchronous version is almost as fast as the synchronous version for small strings and can also provide progress updates.
+* Comprehensive test suite and performance benchmark.
+* Small: <1 KB minified and gzipped
+
+## Installation
+
+### node.js
+
+Install using [npm](http://npmjs.org/):
+
+```bash
+$ npm install fast-levenshtein
+```
+
+### Browser
+
+Using bower:
+
+```bash
+$ bower install fast-levenshtein
+```
+
+If you are not using any module loader system then the API will then be accessible via the `window.Levenshtein` object.
+
+## Examples
+
+**Synchronous**
+
+```javascript
+var levenshtein = require('fast-levenshtein');
+
+var distance = levenshtein.get('back', 'book'); // 2
+var distance = levenshtein.get('我愛你', '我叫你'); // 1
+```
+
+**Asynchronous**
+
+```javascript
+var levenshtein = require('fast-levenshtein');
+
+levenshtein.getAsync('back', 'book', function (err, distance) {
+ // err is null unless an error was thrown
+ // distance equals 2
+});
+```
+
+**Asynchronous with progress updates**
+
+```javascript
+var levenshtein = require('fast-levenshtein');
+
+var hugeText1 = fs.readFileSync(...);
+var hugeText2 = fs.readFileSync(...);
+
+levenshtein.getAsync(hugeText1, hugeText2, function (err, distance) {
+ // process the results as normal
+}, {
+ progress: function(percentComplete) {
+ console.log(percentComplete + ' % completed so far...');
+ }
+);
+```
+
+## Building and Testing
+
+To build the code and run the tests:
+
+```bash
+$ npm install -g grunt-cli
+$ npm install
+$ npm run build
+```
+
+## Performance
+
+_Thanks to [Titus Wormer](https://github.com/wooorm) for [encouraging me](https://github.com/hiddentao/fast-levenshtein/issues/1) to do this._
+
+Benchmarked against other node.js levenshtein distance modules (on Macbook Air 2012, Core i7, 8GB RAM):
+
+```bash
+Running suite Implementation comparison [benchmark/speed.js]...
+>> levenshtein-edit-distance x 234 ops/sec ±3.02% (73 runs sampled)
+>> levenshtein-component x 422 ops/sec ±4.38% (83 runs sampled)
+>> levenshtein-deltas x 283 ops/sec ±3.83% (78 runs sampled)
+>> natural x 255 ops/sec ±0.76% (88 runs sampled)
+>> levenshtein x 180 ops/sec ±3.55% (86 runs sampled)
+>> fast-levenshtein x 1,792 ops/sec ±2.72% (95 runs sampled)
+Benchmark done.
+Fastest test is fast-levenshtein at 4.2x faster than levenshtein-component
+```
+
+You can run this benchmark yourself by doing:
+
+```bash
+$ npm install -g grunt-cli
+$ npm install
+$ npm run build
+$ npm run benchmark
+```
+
+## Contributing
+
+If you wish to submit a pull request please update and/or create new tests for any changes you make and ensure the grunt build passes.
+
+See [CONTRIBUTING.md](https://github.com/hiddentao/fast-levenshtein/blob/master/CONTRIBUTING.md) for details.
+
+## License
+
+MIT - see [LICENSE.md](https://github.com/hiddentao/fast-levenshtein/blob/master/LICENSE.md)
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/benchmark/speed.js b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/benchmark/speed.js
new file mode 100644
index 0000000000..2564430a4f
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/benchmark/speed.js
@@ -0,0 +1,182 @@
+var fastLevenshtein = require('../levenshtein.min').get,
+ levenshtein = require('levenshtein'),
+ levenshteinEditDistance = require('levenshtein-edit-distance'),
+ levenshteinComponent = require('levenshtein-component'),
+ levenshteinDeltas = require('levenshtein-deltas'),
+ natural = require('natural').LevenshteinDistance;
+
+
+
+/* The first 100 words from Letterpress: https://github.com/atebits/Words */
+source = Array(11).join([
+ 'aa',
+ 'aah',
+ 'aahed',
+ 'aahing',
+ 'aahs',
+ 'aal',
+ 'aalii',
+ 'aaliis',
+ 'aals',
+ 'aardvark',
+ 'aardvarks',
+ 'aardwolf',
+ 'aardwolves',
+ 'aargh',
+ 'aarrgh',
+ 'aarrghh',
+ 'aarti',
+ 'aartis',
+ 'aas',
+ 'aasvogel',
+ 'aasvogels',
+ 'ab',
+ 'aba',
+ 'abac',
+ 'abaca',
+ 'abacas',
+ 'abaci',
+ 'aback',
+ 'abacs',
+ 'abacterial',
+ 'abactinal',
+ 'abactinally',
+ 'abactor',
+ 'abactors',
+ 'abacus',
+ 'abacuses',
+ 'abaft',
+ 'abaka',
+ 'abakas',
+ 'abalone',
+ 'abalones',
+ 'abamp',
+ 'abampere',
+ 'abamperes',
+ 'abamps',
+ 'aband',
+ 'abanded',
+ 'abanding',
+ 'abandon',
+ 'abandoned',
+ 'abandonedly',
+ 'abandonee',
+ 'abandonees',
+ 'abandoner',
+ 'abandoners',
+ 'abandoning',
+ 'abandonment',
+ 'abandonments',
+ 'abandons',
+ 'abandonware',
+ 'abandonwares',
+ 'abands',
+ 'abapical',
+ 'abas',
+ 'abase',
+ 'abased',
+ 'abasedly',
+ 'abasement',
+ 'abasements',
+ 'abaser',
+ 'abasers',
+ 'abases',
+ 'abash',
+ 'abashed',
+ 'abashedly',
+ 'abashes',
+ 'abashing',
+ 'abashless',
+ 'abashment',
+ 'abashments',
+ 'abasia',
+ 'abasias',
+ 'abasing',
+ 'abask',
+ 'abatable',
+ 'abate',
+ 'abated',
+ 'abatement',
+ 'abatements',
+ 'abater',
+ 'abaters',
+ 'abates',
+ 'abating',
+ 'abatis',
+ 'abatises',
+ 'abator',
+ 'abators',
+ 'abattis',
+ 'abattises',
+ 'abattoir',
+ 'abattoirs'
+].join('|')).split('|');
+
+
+
+/**
+ * The actual test loop.
+ * @param {Function} fn Levenshtein distance function.
+ */
+var loop = function(fn) {
+ var iterator = -1,
+ previousValue = '',
+ value,
+ dist;
+
+ while (value = source[++iterator]) {
+ dist = fn(previousValue, value);
+ previousValue = value;
+ }
+};
+
+
+/** @type {Object} Test config */
+module.exports = {
+ name: 'Implementation comparison',
+ onComplete: function() {
+ console.log('Benchmark done.');
+ },
+ tests: [
+ {
+ name: 'levenshtein-edit-distance',
+ fn: function() {
+ loop(levenshteinEditDistance);
+ }
+ },
+ {
+ name: 'levenshtein-component',
+ fn: function() {
+ loop(levenshteinComponent);
+ }
+ },
+ {
+ name: 'levenshtein-deltas',
+ fn: function() {
+ loop(function(v1,v2) {
+ return new levenshteinDeltas.Lev(v1,v2).distance();
+ });
+ }
+ },
+ {
+ name: 'natural',
+ fn: function() {
+ loop(natural);
+ }
+ },
+ {
+ name: 'levenshtein',
+ fn: function() {
+ loop(levenshtein);
+ }
+ },
+ {
+ name: 'fast-levenshtein',
+ fn: function() {
+ loop(fastLevenshtein);
+ }
+ },
+ ]
+};
+
+
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/bower.json b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/bower.json
new file mode 100644
index 0000000000..1670393417
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/bower.json
@@ -0,0 +1,30 @@
+{
+ "name": "fast-levenshtein",
+ "version": "1.0.6",
+ "homepage": "https://github.com/hiddentao/fast-levenshtein",
+ "authors": [
+ "Ramesh Nair <ram@hiddentao.com>"
+ ],
+ "description": "Efficient implementation of Levenshtein algorithm with asynchronous callback support",
+ "main": "levenshtein.js",
+ "moduleType": [
+ "amd",
+ "globals",
+ "node"
+ ],
+ "keywords": [
+ "levenshtein",
+ "distance",
+ "string"
+ ],
+ "license": "MIT",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests",
+ "benchmark",
+ "Gruntfile.js"
+ ]
+}
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/levenshtein.js b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/levenshtein.js
new file mode 100644
index 0000000000..0028f405ac
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/levenshtein.js
@@ -0,0 +1,198 @@
+(function() {
+ 'use strict';
+
+ /**
+ * Extend an Object with another Object's properties.
+ *
+ * The source objects are specified as additional arguments.
+ *
+ * @param dst Object the object to extend.
+ *
+ * @return Object the final object.
+ */
+ var _extend = function(dst) {
+ var sources = Array.prototype.slice.call(arguments, 1);
+ for (var i=0; i<sources.length; ++i) {
+ var src = sources[i];
+ for (var p in src) {
+ if (src.hasOwnProperty(p)) dst[p] = src[p];
+ }
+ }
+ return dst;
+ };
+
+ /**
+ * Based on the algorithm at http://en.wikipedia.org/wiki/Levenshtein_distance.
+ */
+ var Levenshtein = {
+ /**
+ * Calculate levenshtein distance of the two strings.
+ *
+ * @param str1 String the first string.
+ * @param str2 String the second string.
+ * @return Integer the levenshtein distance (0 and above).
+ */
+ get: function(str1, str2) {
+ // base cases
+ if (str1 === str2) return 0;
+ if (str1.length === 0) return str2.length;
+ if (str2.length === 0) return str1.length;
+
+ // two rows
+ var prevRow = new Array(str2.length + 1),
+ curCol, nextCol, i, j, tmp;
+
+ // initialise previous row
+ for (i=0; i<prevRow.length; ++i) {
+ prevRow[i] = i;
+ }
+
+ // calculate current row distance from previous row
+ for (i=0; i<str1.length; ++i) {
+ nextCol = i + 1;
+
+ for (j=0; j<str2.length; ++j) {
+ curCol = nextCol;
+
+ // substution
+ nextCol = prevRow[j] + ( (str1.charAt(i) === str2.charAt(j)) ? 0 : 1 );
+ // insertion
+ tmp = curCol + 1;
+ if (nextCol > tmp) {
+ nextCol = tmp;
+ }
+ // deletion
+ tmp = prevRow[j + 1] + 1;
+ if (nextCol > tmp) {
+ nextCol = tmp;
+ }
+
+ // copy current col value into previous (in preparation for next iteration)
+ prevRow[j] = curCol;
+ }
+
+ // copy last col value into previous (in preparation for next iteration)
+ prevRow[j] = nextCol;
+ }
+
+ return nextCol;
+ },
+
+ /**
+ * Asynchronously calculate levenshtein distance of the two strings.
+ *
+ * @param str1 String the first string.
+ * @param str2 String the second string.
+ * @param cb Function callback function with signature: function(Error err, int distance)
+ * @param [options] Object additional options.
+ * @param [options.progress] Function progress callback with signature: function(percentComplete)
+ */
+ getAsync: function(str1, str2, cb, options) {
+ options = _extend({}, {
+ progress: null
+ }, options);
+
+ // base cases
+ if (str1 === str2) return cb(null, 0);
+ if (str1.length === 0) return cb(null, str2.length);
+ if (str2.length === 0) return cb(null, str1.length);
+
+ // two rows
+ var prevRow = new Array(str2.length + 1),
+ curCol, nextCol,
+ i, j, tmp,
+ startTime, currentTime;
+
+ // initialise previous row
+ for (i=0; i<prevRow.length; ++i) {
+ prevRow[i] = i;
+ }
+
+ nextCol = 1;
+ i = 0;
+ j = -1;
+
+ var __calculate = function() {
+ // reset timer
+ startTime = new Date().valueOf();
+ currentTime = startTime;
+
+ // keep going until one second has elapsed
+ while (currentTime - startTime < 1000) {
+ // reached end of current row?
+ if (str2.length <= (++j)) {
+ // copy current into previous (in preparation for next iteration)
+ prevRow[j] = nextCol;
+
+ // if already done all chars
+ if (str1.length <= (++i)) {
+ return cb(null, nextCol);
+ }
+ // else if we have more left to do
+ else {
+ nextCol = i + 1;
+ j = 0;
+ }
+ }
+
+ // calculation
+ curCol = nextCol;
+
+ // substution
+ nextCol = prevRow[j] + ( (str1.charAt(i) === str2.charAt(j)) ? 0 : 1 );
+ // insertion
+ tmp = curCol + 1;
+ if (nextCol > tmp) {
+ nextCol = tmp;
+ }
+ // deletion
+ tmp = prevRow[j + 1] + 1;
+ if (nextCol > tmp) {
+ nextCol = tmp;
+ }
+
+ // copy current into previous (in preparation for next iteration)
+ prevRow[j] = curCol;
+
+ // get current time
+ currentTime = new Date().valueOf();
+ }
+
+ // send a progress update?
+ if (null !== options.progress) {
+ try {
+ options.progress.call(null, (i * 100.0/ str1.length));
+ } catch (err) {
+ return cb('Progress callback: ' + err.toString());
+ }
+ }
+
+ // next iteration
+ setTimeout(__calculate(), 0);
+ };
+
+ __calculate();
+ }
+
+ };
+
+ // amd
+ if (typeof define !== "undefined" && define !== null && define.amd) {
+ define(function() {
+ return Levenshtein;
+ });
+ }
+ // commonjs
+ else if (typeof module !== "undefined" && module !== null) {
+ module.exports = Levenshtein;
+ }
+ // web worker
+ else if (typeof self !== "undefined" && typeof self.postMessage === 'function' && typeof self.importScripts === 'function') {
+ self.Levenshtein = Levenshtein;
+ }
+ // browser main thread
+ else if (typeof window !== "undefined" && window !== null) {
+ window.Levenshtein = Levenshtein;
+ }
+}());
+
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/levenshtein.min.js b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/levenshtein.min.js
new file mode 100644
index 0000000000..94d89ee5c8
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/levenshtein.min.js
@@ -0,0 +1,2 @@
+/*! fast-levenshtein 2014-12-17. Copyright Ramesh Nair <ram@hiddentao.com> (http://www.hiddentao.com/) */
+!function(){"use strict";var a=function(a){for(var b=Array.prototype.slice.call(arguments,1),c=0;c<b.length;++c){var d=b[c];for(var e in d)d.hasOwnProperty(e)&&(a[e]=d[e])}return a},b={get:function(a,b){if(a===b)return 0;if(0===a.length)return b.length;if(0===b.length)return a.length;var c,d,e,f,g,h=new Array(b.length+1);for(e=0;e<h.length;++e)h[e]=e;for(e=0;e<a.length;++e){for(d=e+1,f=0;f<b.length;++f)c=d,d=h[f]+(a.charAt(e)===b.charAt(f)?0:1),g=c+1,d>g&&(d=g),g=h[f+1]+1,d>g&&(d=g),h[f]=c;h[f]=d}return d},getAsync:function(b,c,d,e){if(e=a({},{progress:null},e),b===c)return d(null,0);if(0===b.length)return d(null,c.length);if(0===c.length)return d(null,b.length);var f,g,h,i,j,k,l,m=new Array(c.length+1);for(h=0;h<m.length;++h)m[h]=h;g=1,h=0,i=-1;var n=function(){for(k=(new Date).valueOf(),l=k;1e3>l-k;){if(c.length<=++i){if(m[i]=g,b.length<=++h)return d(null,g);g=h+1,i=0}f=g,g=m[i]+(b.charAt(h)===c.charAt(i)?0:1),j=f+1,g>j&&(g=j),j=m[i+1]+1,g>j&&(g=j),m[i]=f,l=(new Date).valueOf()}if(null!==e.progress)try{e.progress.call(null,100*h/b.length)}catch(a){return d("Progress callback: "+a.toString())}setTimeout(n(),0)};n()}};"undefined"!=typeof define&&null!==define&&define.amd?define(function(){return b}):"undefined"!=typeof module&&null!==module?module.exports=b:"undefined"!=typeof self&&"function"==typeof self.postMessage&&"function"==typeof self.importScripts?self.Levenshtein=b:"undefined"!=typeof window&&null!==window&&(window.Levenshtein=b)}(); \ No newline at end of file
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/package.json b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/package.json
new file mode 100644
index 0000000000..b130071e3f
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/package.json
@@ -0,0 +1,62 @@
+{
+ "name": "fast-levenshtein",
+ "version": "1.0.6",
+ "description": "Efficient implementation of Levenshtein algorithm with asynchronous callback support",
+ "main": "levenshtein.js",
+ "scripts": {
+ "build": "grunt build",
+ "benchmark": "grunt benchmark"
+ },
+ "devDependencies": {
+ "lodash": "~1.2.0",
+ "chai": "~1.5.0",
+ "mocha": "~1.9.0",
+ "grunt-contrib-uglify": "~0.2.0",
+ "grunt": "~0.4.1",
+ "grunt-contrib-jshint": "~0.4.3",
+ "grunt-mocha-test": "~0.2.2",
+ "grunt-npm-install": "~0.1.0",
+ "load-grunt-tasks": "~0.6.0",
+ "grunt-benchmark": "~0.2.0"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/hiddentao/fast-levenshtein.git"
+ },
+ "keywords": [
+ "levenshtein",
+ "distance",
+ "string"
+ ],
+ "author": {
+ "name": "Ramesh Nair",
+ "email": "ram@hiddentao.com",
+ "url": "http://www.hiddentao.com/"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/hiddentao/fast-levenshtein/issues"
+ },
+ "homepage": "https://github.com/hiddentao/fast-levenshtein",
+ "_id": "fast-levenshtein@1.0.6",
+ "_shasum": "3bedb184e39f95cb0d88928688e6b1ee3273446a",
+ "_from": "fast-levenshtein@>=1.0.0 <1.1.0",
+ "_npmVersion": "1.4.9",
+ "_npmUser": {
+ "name": "hiddentao",
+ "email": "ram@hiddentao.com"
+ },
+ "maintainers": [
+ {
+ "name": "hiddentao",
+ "email": "ram@hiddentao.com"
+ }
+ ],
+ "dist": {
+ "shasum": "3bedb184e39f95cb0d88928688e6b1ee3273446a",
+ "tarball": "http://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.0.6.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.0.6.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/mocha.opts b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/mocha.opts
new file mode 100644
index 0000000000..a8ccfb4515
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/mocha.opts
@@ -0,0 +1,2 @@
+--ui exports
+--reporter spec
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/tests.js b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/tests.js
new file mode 100644
index 0000000000..54b92220aa
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/tests.js
@@ -0,0 +1,171 @@
+var _ = require('lodash'),
+ chai = require('chai'),
+ fs = require('fs'),
+ levenshtein = require('../levenshtein.min');
+
+var expect = chai.expect,
+ assert = chai.assert;
+
+
+/**
+ * Create test functions.
+ * @return Object
+ */
+var createTests = function(str1, str2, expectedLength, options) {
+ options = _.extend({}, {
+ description: null
+ }, options);
+
+ if (!options.description) {
+ options.description = (0 === str1.length ? '(empty)' : str1) + ' <-> ' + (0 === str2.length ? '(empty)' : str2);
+ }
+
+ var ret = {};
+
+ ret["SYNC:\t" + options.description] = function() {
+ expect(levenshtein.get(str1, str2)).to.eql(expectedLength);
+ };
+
+ ret["ASYNC:\t" + options.description] = function(done) {
+ levenshtein.getAsync(str1, str2, function(err, distance) {
+ expect(err).to.be.null;
+ expect(distance).to.eql(expectedLength);
+
+ done();
+ });
+ };
+
+ return ret;
+};
+
+
+// ----- Basic tests ----- //
+
+(function() {
+
+ var tests = {},
+ str = 'hello',
+ str1 = str,
+ str2 = str,
+ i;
+
+ // equal strings
+ _.extend(tests, createTests('hello', 'hello', 0));
+
+ // inserts
+ for (i=0; i<=str.length; ++i) {
+ str1 = str.substr(0,i);
+ str2 = str;
+
+ _.extend(tests, createTests(str1, str2, str.length - i));
+ }
+
+ // deletes
+ for (i=str.length-1; i>=0; --i) {
+ str1 = str;
+ str2 = str.substr(0,i);
+
+ _.extend(tests, createTests(str1, str2, str.length - i));
+ }
+
+ // substitutions
+ _.extend(tests, createTests("a", "b", 1 ));
+ _.extend(tests, createTests("ab", "ac", 1 ));
+ _.extend(tests, createTests("ac", "bc", 1 ));
+ _.extend(tests, createTests("abc", "axc", 1 ));
+ _.extend(tests, createTests("xabxcdxxefxgx", "1ab2cd34ef5g6", 6 ));
+
+ // many ops
+ _.extend(tests, createTests('xabxcdxxefxgx', 'abcdefg', 6));
+ _.extend(tests, createTests('javawasneat', 'scalaisgreat', 7));
+ _.extend(tests, createTests("example", "samples", 3));
+ _.extend(tests, createTests("sturgeon", "urgently", 6 ));
+ _.extend(tests, createTests("levenshtein", "frankenstein", 6 ));
+ _.extend(tests, createTests("distance", "difference", 5 ));
+
+ // non-latin
+ _.extend(tests, createTests('因為我是中國人所以我會說中文', '因為我是英國人所以我會說英文', 2, {
+ description: 'non-latin'
+ }));
+
+ // long text
+ _.extend(tests, createTests(
+ 'Morbi interdum ultricies neque varius condimentum. Donec volutpat turpis interdum metus ultricies vulputate. Duis ultricies rhoncus sapien, sit amet fermentum risus imperdiet vitae. Ut et lectus',
+ 'Duis erat dolor, cursus in tincidunt a, lobortis in odio. Cras magna sem, pharetra et iaculis quis, faucibus quis tellus. Suspendisse dapibus sapien in justo cursus',
+ 143,
+ {
+ description: 'long text'
+ }
+ ));
+
+ exports['Basic'] = tests;
+})();
+
+// ------ Asynchronous tests ----- //
+
+var text1 = fs.readFileSync(__dirname + '/text1.txt', 'utf-8'),
+ text2 = fs.readFileSync(__dirname + '/text2.txt', 'utf-8');
+
+exports['Async'] = {
+ 'no progress callback': function(done) {
+ this.timeout(20000);
+
+ var startTime = new Date().valueOf();
+
+ levenshtein.getAsync(text1, text2, function(err, distance) {
+ var timeElapsed = new Date().valueOf() - startTime;
+
+ expect(err).to.be.null;
+ expect(distance).to.eql(194);
+
+ console.log(timeElapsed + ' ms');
+
+ done();
+ });
+ },
+ 'with progress callback': function(done) {
+ this.timeout(20000);
+
+ var percents = [];
+ var progress = function(percent) {
+ percents.push(percent);
+ };
+
+ var startTime = new Date().valueOf();
+
+ levenshtein.getAsync(text1, text2, function(err, distance) {
+ var timeElapsed = new Date().valueOf() - startTime;
+
+ expect(err).to.be.null;
+ expect(distance).to.eql(194);
+
+ console.log(timeElapsed + ' ms, ' + percents.length + ' progress updates');
+
+ expect(0 < percents.length).to.be.true;
+
+ // check percentages
+ var lastPercent = 0;
+ _.each(percents, function(percent) {
+ expect(100 >= percent);
+ expect(percent > lastPercent);
+ lastPercent = percent;
+ });
+
+ done();
+ }, {
+ progress: progress
+ });
+ },
+ 'progress callback error': function(done) {
+ levenshtein.getAsync(text1 + text2, text2 + text1, function(err) {
+ expect(err.toString()).to.be.eql('Progress callback: Error: Bla bla');
+
+ done();
+ }, {
+ progress: function() {
+ throw new Error('Bla bla');
+ }
+ });
+ }
+};
+
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/text1.txt b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/text1.txt
new file mode 100644
index 0000000000..4833682aca
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/text1.txt
@@ -0,0 +1 @@
+Duis mollis rhoncus turpis. Proin ut nunc eget urna molestie dictum. Cras mollis nibh quis eros faucibus posuere vehicula diam rutrum. Morbi mattis orci vel ante dignissim sollicitudin. Aenean quis enim orci. Integer vehicula elementum porta. Nullam massa mauris, ornare eget ullamcorper eget, consequat at dolor. Integer cursus pellentesque velit in semper. Donec sem turpis, tristique vitae egestas nec, varius sit amet ipsum. Nullam scelerisque est eu arcu vulputate varius. Integer vel gravida leo. Suspendisse blandit vehicula neque, non porttitor eros adipiscing non. Curabitur egestas pulvinar sapien ac imperdiet. Ut ac purus sit amet magna sollicitudin cursus non vel eros. In vel nibh eget libero mattis volutpat nec vulputate quam. Vestibulum commodo ante id magna cursus tristique. Integer rutrum diam sit amet nulla placerat ornare. Quisque nec felis lacus. In lorem mauris, lobortis sit amet sodales non, sollicitudin vitae odio. Nam a dui est, venenatis iaculis purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In in sollicitudin urna. Praesent dapibus ligula sed lacus pulvinar sit amet pellentesque enim tincidunt. Vivamus feugiat, sapien vitae convallis consectetur, justo ligula semper quam, mollis dapibus lorem odio sit amet justo. Duis ut leo vel turpis cursus tempor. Donec condimentum convallis lacus at feugiat. Aliquam erat volutpat. Etiam auctor risus dolor, in tempor nibh. Nulla interdum, magna eget suscipit aliquet, enim arcu aliquet nunc, vel molestie est sem ac turpis. Ut et convallis diam. Integer malesuada eleifend eros non sollicitudin. In ac sem eget purus iaculis sollicitudin. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse ultrices nulla sit amet sapien fringilla eleifend. Integer eget lectus a augue convallis dignissim sit amet scelerisque odio. Duis velit nisl, mollis a adipiscing eget, suscipit in quam. Sed id lacus et justo dapibus dapibus vestibulum gravida massa. Duis euismod luctus tempor. Nam venenatis gravida rutrum. Etiam id aliquet est. Integer ante arcu, viverra sit amet placerat sit amet, posuere in est. Cras eleifend ultricies urna, ut euismod quam euismod quis. Cras pellentesque nulla et ante molestie pulvinar. Duis malesuada bibendum arcu, id imperdiet enim egestas eget. Sed blandit iaculis enim vel adipiscing. Donec dui quam, tristique non tincidunt sed, interdum luctus ante. Etiam eget nisl id est hendrerit egestas. Vestibulum tempor justo magna, non sagittis felis. Vivamus nec nibh porta nibh cursus luctus suscipit ut nibh. Aenean mollis molestie justo, non ornare mi mollis id. Vestibulum massa neque, mattis eget pulvinar et, tincidunt in magna. Nunc vitae dapibus turpis. Nullam bibendum vehicula odio sed viverra. Donec laoreet, lectus sit amet viverra scelerisque, mi enim fermentum tellus, quis consequat arcu felis in ante. Donec non felis non nisl tincidunt ultricies sit amet nec mi. Maecenas sodales, lorem vel volutpat cursus, nisi tortor pulvinar eros, in pharetra mauris neque sit amet nulla. Nulla ligula turpis, egestas in imperdDuis mollis rhoncus turpis. Proin ut nunc eget urna molestie dictum. Cras mollis nibh quis eros faucibus posuere vehicula diam rutrum. Morbi mattis orci vel ante dignissim sollicitudin. Aenean quis enim orci. Integer vehicula elementum porta. Nullam massa mauris, ornare eget ullamcorper eget, consequat at dolor. Integer cursus pellentesque velit in semper. Donec sem turpis, tristique vitae egestas nec, varius sit amet ipsum. Nullam scelerisque est eu arcu vulputate varius. Integer vel gravida leo. Suspendisse blandit vehicula neque, non porttitor eros adipiscing non. Curabitur egestas pulvinar sapien ac imperdiet. Ut ac purus sit amet magna sollicitudin cursus non vel eros. In vel nibh eget libero mattis volutpat nec vulputate quam. Vestibulum commodo ante id magna cursus tristique. Integer rutrum diam sit amet nulla placerat ornare. Quisque nec felis lacus. In lorem mauris, lobortis sit amet sodales non, sollicitudin vitae odio. Nam a dui est, venenatis iaculis purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In in sollicitudin urna. Praesent dapibus ligula sed lacus pulvinar sit amet pellentesque enim tincidunt. Vivamus feugiat, sapien vitae convallis consectetur, justo ligula semper quam, mollis dapibus lorem odio sit amet justo. Duis ut leo vel turpis cursus tempor. Donec condimentum convallis lacus at feugiat. Aliquam erat volutpat. Etiam auctor risus dolor, in tempor nibh. Nulla interdum, magna eget suscipit aliquet, enim arcu aliquet nunc, vel molestie est sem ac turpis. Ut et convallis diam. Integer malesuada eleifend eros non sollicitudin. In ac sem eget purus iaculis sollicitudin. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse ultrices nulla sit amet sapien fringilla eleifend. Integer eget lectus a augue convallis dignissim sit amet scelerisque odio. Duis velit nisl, mollis a adipiscing eget, suscipit in quam. Sed id lacus et justo dapibus dapibus vestibulum gravida massa. Duis euismod luctus tempor. Nam venenatis gravida rutrum. Etiam id aliquet est. Integer ante arcu, viverra sit amet placerat sit amet, posuere in est. Cras eleifend ultricies urna, ut euismod quam euismod quis. Cras pellentesque nulla et ante molestie pulvinar. Duis malesuada bibendum arcu, id imperdiet enim egestas eget. Sed blandit iaculis enim vel adipiscing. Donec dui quam, tristique non tincidunt sed, interdum luctus ante. Etiam eget nisl id est hendrerit egestas. Vestibulum tempor justo magna, non sagittis felis. Vivamus nec nibh porta nibh cursus luctus suscipit ut nibh. Aenean mollis molestie justo, non ornare mi mollis id. Vestibulum massa neque, mattis eget pulvinar et, tincidunt in magna. Nunc vitae dapibus turpis. Nullam bibendum vehicula odio sed viverra. Donec laoreet, lectus sit amet viverra scelerisque, mi enim fermentum tellus, quis consequat arcu felis in ante. Donec non felis non nisl tincidunt ultricies sit amet nec mi. Maecenas sodales, lorem vel volutpat cursus, nisi tortor pulvinar eros, in pharetra mauris neque sit amet nulla. Nulla ligula turpis, egestas in imperdiet a, faucibus quis turpis. Vivamus purus lorem, vestibulum id rhoncus iaculis, vulputate nec mi \ No newline at end of file
diff --git a/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/text2.txt b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/text2.txt
new file mode 100644
index 0000000000..ca15f413dc
--- /dev/null
+++ b/tools/eslint/node_modules/optionator/node_modules/fast-levenshtein/test/text2.txt
@@ -0,0 +1 @@
+Duis mollis rhoncus turpis. Proin ut nunc eget urna molestie dictum. Cras mollis nibh quis eros faucibus posuere vehicula diam rutrum. Morbi mattis orci vel ante dignissim sollicitudin. Aenean quis enim orci. Integer vehicula elementum porta. Nullam massa mauris, ornare eget ullamcorper eget, consequat at dolor. Integer cursus pellentesque velit in semper. Donec sem turpis, tristique vitae egestas nec, varius sit amet ipsum. Nullam scelerisque est eu arcu vulputate varius. Integer vel gravida leo. Suspendisse blandit vehicula neque, non porttitor eros adipiscing non. Curabitur egestas pulvinar sapien ac imperdiet. Ut ac purus sit amet magna sollicitudin cursus non vel eros. In vel nibh eget libero mattis volutpat nec vulputate quam. Vestibulum commodo ante id magna cursus tristique. Integer rutrum diam sit amet nulla placerat ornare. Quisque nec felis lacus. In lorem mauris, lobortis sit amet sodales non, sollicitudin vitae odio. Nam a dui est, venenatis iaculis purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In in sollicitudin urna. Praesent dapibus ligula sed lacus pulvinar sit amet pellentesque enim tincidunt. Vivamus feugiat, sapien vitae convallis consectetur, justo ligula semper quam, mollis dapibus lorem odio sit amet justo. Duis ut leo vel turpis cursus tempor. Donec condimentum convallis lacus at feugiat. Aliquam erat volutpat. Etiam auctor risus dolor, in tempor nibh. Nulla interdum, magna eget suscipit aliquet, enim arcu aliquet nunc, vel molestie est sem ac turpis. Ut et convallis diam. Integer malesuada eleifend eros non sollicitudin. In ac sem eget purus iaculis sollicitudin. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse ultrices nulla sit amet sapien fringilla eleifend. Integer eget lectus a augue convallis dignissim sit amet scelerisque odio. Duis velit nisl, mollis a adipiscing eget, suscipit in quam. Sed id lacus et justo dapibus dapibus vestibulum gravida massa. Duis euismod luctus tempor. Nam venenatis gravida rutrum. Etiam id aliquet est. Integer ante arcu, viverra sit amet placerat sit amet, posuere in est. Cras eleifend ultricies urna, ut euismod quam euismod quis. Cras pellentesque nulla et ante molestie pulvinar. Duis malesuada bibendum arcu, id imperdiet enim egestas eget. Sed blandit iaculis enim vel adipiscing. Donec dui quam, tristique non tincidunt sed, interdum luctus ante. Etiam eget nisl id est hendrerit egestas. Vestibulum tempor justo magna, non sagittis felis. Vivamus nec nibh porta nibh cursus luctus suscipit ut nibh. Aenean mollis molestie justo, non ornare mi mollis id. Vestibulum massa neque, mattis eget pulvinar et, tincidunt in magna. Nunc vitae dapibus turpis. Nullam bibendum vehicula odio sed viverra. Donec laoreet, lectus sit amet viverra scelerisque, mi enim fermentum tellus, quis consequat arcu felis in ante. Donec non felis non nisl tincidunt ultricies sit amet nec mi. Maecenas sodales, lorem vel volutpat cursus, nisi tortor pulvinar eros, in pharetra mauris neque sit amet nulla. Nulla ligula turpis, egestas in imperdiet a, faucibus quis turpis. Vivamus purus lorem, vestibulum id rhoncus iaculis, vulputate nec miDuis mollis rhoncus turpis. Proin ut nunc eget urna molestie dictum. Cras mollis nibh quis eros faucibus posuere vehicula diam rutrum. Morbi mattis orci vel ante dignissim sollicitudin. Aenean quis enim orci. Integer vehicula elementum porta. Nullam massa mauris, ornare eget ullamcorper eget, consequat at dolor. Integer cursus pellentesque velit in semper. Donec sem turpis, tristique vitae egestas nec, varius sit amet ipsum. Nullam scelerisque est eu arcu vulputate varius. Integer vel gravida leo. Suspendisse blandit vehicula neque, non porttitor eros adipiscing non. Curabitur egestas pulvinar sapien ac imperdiet. Ut ac purus sit amet magna sollicitudin cursus non vel eros. In vel nibh eget libero mattis volutpat nec vulputate quam. Vestibulum commodo ante id magna cursus tristique. Integer rutrum diam sit amet nulla placerat ornare. Quisque nec felis lacus. In lorem mauris, lobortis sit amet sodales non, sollicitudin vitae odio. Nam a dui est, venenatis iaculis purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In in sollicitudin urna. Praesent dapibus ligula sed lacus pulvinar sit amet pellentesque enim tincidunt. Vivamus feugiat, sapien vitae convallis consectetur, justo ligula semper quam, mollis dapibus lorem odio sit amet justo. Duis ut leo vel turpis cursus tempor. Donec condimentum convallis lacus at feugiat. Aliquam erat volutpat. Etiam auctor risus dolor, in tempor nibh. Nulla interdum, magna eget suscipit aliquet, enim arcu aliquet nunc, vel molestie est sem ac turpis. Ut et convallis diam. Integer malesuada eleifend eros non sollicitudin. In ac sem eget purus iaculis sollicitudin. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse ultrices nulla sit amet sapien fringilla eleifend. Integer eget lectus a augue convallis dignissim sit amet scelerisque odio. Duis velit nisl, mollis a adipiscing eget, suscipit in quam. Sed id lacus et justo dapibus dapibus vestibulum gravida massa. Duis euismod luctus tempor. Nam venenatis gravida rutrum. Etiam id aliquet est. Integer ante arcu, viverra sit amet placerat sit amet, posuere in est. Cras eleifend ultricies urna, ut euismod quam euismod quis. Cras pellentesque nulla et ante molestie pulvinar. Duis malesuada bibendum arcu, id imperdiet enim egestas eget. Sed blandit iaculis enim vel adipiscing. Donec dui quam, tristique non tincidunt sed, interdum luctus ante. Etiam eget nisl id est hendrerit egestas. Vestibulum tempor justo magna, non sagittis felis. Vivamus nec nibh porta nibh cursus luctus suscipit ut nibh. Aenean mollis molestie justo, non ornare mi mollis id. Vestibulum massa neque, mattis eget pulvinar et, tincidunt in magna. Nunc vitae dapibus turpis. Nullam bibendum vehicula odio sed viverra. Donec laoreet, lectus sit amet viverra scelerisque, mi enim fermentum tellus, quis consequat arcu felis in ante. Donec non felis non nisl tincidunt ultricies sit amet nec mi. Maecenas sodales, lorem vel volutpat cursus, nisi tortor pulvinar eros, in pharetra mauris neque sit amet nulla. Nulla ligula turpis, egestas in imperd \ No newline at end of file