let Differ , Heap , IS_CHARACTER_JUNK , IS_LINE_JUNK , SequenceMatcher , contextDiff , floor , max , min , ndiff , restore , unifiedDiff , _any , _arrayCmp , _calculateRatio , _countLeading , _formatRangeContext , _formatRangeUnified , _has , __indexOf = [ ] . indexOf || function ( item ) { for ( let i = 0 , l = this . length ; i < l ; i ++ ) { if ( i in this && this [ i ] === item ) return i ; } return - 1 ; } ; ( floor = Math . floor ) , ( max = Math . max ) , ( min = Math . min ) ; _calculateRatio = function ( matches , length ) { if ( length ) { return ( 2.0 * matches ) / length ; } else { return 1.0 ; } } ; _arrayCmp = function ( a , b ) { let i , la , lb , _i , _ref , _ref1 ; ( _ref = [ a . length , b . length ] ) , ( la = _ref [ 0 ] ) , ( lb = _ref [ 1 ] ) ; for ( i = _i = 0 , _ref1 = min ( la , lb ) ; 0 <= _ref1 ? _i < _ref1 : _i > _ref1 ; i = 0 <= _ref1 ? ++ _i : -- _i ) { if ( a [ i ] < b [ i ] ) { return - 1 ; } if ( a [ i ] > b [ i ] ) { return 1 ; } } return la - lb ; } ; _has = function ( obj , key ) { return Object . prototype . hasOwnProperty . call ( obj , key ) ; } ; _any = function ( items ) { let item , _i , _len ; for ( _i = 0 , _len = items . length ; _i < _len ; _i ++ ) { item = items [ _i ] ; if ( item ) { return true ; } } return false ; } ; SequenceMatcher = ( function ( ) { function SequenceMatcher ( isjunk , a , b , autojunk ) { this . isjunk = isjunk ; if ( a == null ) { a = "" ; } if ( b == null ) { b = "" ; } this . autojunk = autojunk != null ? autojunk : true ; this . a = this . b = null ; this . setSeqs ( a , b ) ; } SequenceMatcher . prototype . setSeqs = function ( a , b ) { this . setSeq1 ( a ) ; return this . setSeq2 ( b ) ; } ; SequenceMatcher . prototype . setSeq1 = function ( a ) { if ( a === this . a ) { return ; } this . a = a ; return ( this . matchingBlocks = this . opcodes = null ) ; } ; SequenceMatcher . prototype . setSeq2 = function ( b ) { if ( b === this . b ) { return ; } this . b = b ; this . matchingBlocks = this . opcodes = null ; this . fullbcount = null ; return this . _chainB ( ) ; } ; SequenceMatcher . prototype . _chainB = function ( ) { let b , b2j , elt , i , idxs , indices , isjunk , junk , n , ntest , popular , _i , _j , _len , _len1 , _ref ; b = this . b ; this . b2j = b2j = { } ; for ( i = _i = 0 , _len = b . length ; _i < _len ; i = ++ _i ) { elt = b [ i ] ; indices = _has ( b2j , elt ) ? b2j [ elt ] : ( b2j [ elt ] = [ ] ) ; indices . push ( i ) ; } junk = { } ; isjunk = this . isjunk ; if ( isjunk ) { _ref = Object . keys ( b2j ) ; for ( _j = 0 , _len1 = _ref . length ; _j < _len1 ; _j ++ ) { elt = _ref [ _j ] ; if ( isjunk ( elt ) ) { junk [ elt ] = true ; delete b2j [ elt ] ; } } } popular = { } ; n = b . length ; if ( this . autojunk && n >= 200 ) { ntest = floor ( n / 100 ) + 1 ; for ( elt in b2j ) { idxs = b2j [ elt ] ; if ( idxs . length > ntest ) { popular [ elt ] = true ; delete b2j [ elt ] ; } } } this . isbjunk = function ( b ) { return _has ( junk , b ) ; } ; return ( this . isbpopular = function ( b ) { return _has ( popular , b ) ; } ) ; } ; SequenceMatcher . prototype . findLongestMatch = function ( alo , ahi , blo , bhi ) { let a , b , b2j , besti , bestj , bestsize , i , isbjunk , j , j2len , k , newj2len , _i , _j , _len , _ref , _ref1 , _ref2 , _ref3 , _ref4 , _ref5 ; ( _ref = [ this . a , this . b , this . b2j , this . isbjunk ] ) , ( a = _ref [ 0 ] ) , ( b = _ref [ 1 ] ) , ( b2j = _ref [ 2 ] ) , ( isbjunk = _ref [ 3 ] ) ; ( _ref1 = [ alo , blo , 0 ] ) , ( besti = _ref1 [ 0 ] ) , ( bestj = _ref1 [ 1 ] ) , ( bestsize = _ref1 [ 2 ] ) ; j2len = { } ; for ( i = _i = alo ; alo <= ahi ? _i < ahi : _i > ahi ; i = alo <= ahi ? ++ _i : -- _i ) { newj2len = { } ; _ref2 = _has ( b2j , a [ i ] ) ? b2j [ a [ i ] ] : [ ] ; for ( _j = 0 , _len = _ref2 . length ; _j < _len ; _j ++ ) { j = _ref2 [ _j ] ; if ( j < blo ) { continue ; } if ( j >= bhi ) { break ; } k = newj2len [ j ] = ( j2len [ j - 1 ] || 0 ) + 1 ; if ( k > bestsize ) { ( _ref3 = [ i - k + 1 , j - k + 1 , k ] ) , ( besti = _ref3 [ 0 ] ) , ( bestj = _ref3 [ 1 ] ) , ( bestsize = _ref3 [ 2 ] ) ; } } j2len = newj2len ; } while ( besti > alo && bestj > blo && ! isbjunk ( b [ bestj - 1 ] ) && a [ besti - 1 ] === b [ bestj - 1 ] ) { ( _ref4 = [ besti - 1 , bestj - 1 , bestsize + 1 ] ) , ( besti = _ref4 [ 0 ] ) , ( bestj = _ref4 [ 1 ] ) , ( bestsize = _ref4 [ 2 ] ) ; } while ( besti + bestsize < ahi && bestj + bestsize < bhi && ! isbjunk ( b [ bestj + bestsize ] ) && a [ besti + bestsize ] === b [ bestj + bestsize ] ) { bestsize ++ ; } while ( besti > alo && bestj > blo && isbjunk ( b [ bestj - 1 ] ) && a [ besti - 1 ] === b [ bestj - 1 ] ) { ( _ref5 = [ besti - 1 , bestj - 1 , bestsize + 1 ] ) , ( besti = _ref5 [ 0 ] ) , ( bestj = _ref5 [ 1 ] ) , ( bestsize = _ref5 [ 2 ] ) ; } while ( besti + bestsize < ahi && bestj + bestsize < bhi && isbjunk ( b [ bestj + bestsize ] ) && a [ besti + bestsize ] === b [ bestj + bestsize ] ) { bestsize ++ ; } return [ besti , bestj , bestsize ] ; } ; SequenceMatcher . prototype . getMatchingBlocks = function ( ) { let ahi , alo , bhi , blo , i , i1 , i2 , j , j1 , j2 , k , k1 , k2 , la , lb , matchingBlocks , nonAdjacent , queue , x , _i , _len , _ref , _ref1 , _ref2 , _ref3 , _ref4 ; if ( this . matchingBlocks ) { return this . matchingBlocks ; } ( _ref = [ this . a . length , this . b . length ] ) , ( la = _ref [ 0 ] ) , ( lb = _ref [ 1 ] ) ; queue = [ [ 0 , la , 0 , lb ] ] ; matchingBlocks = [ ] ; while ( queue . length ) { ( _ref1 = queue . pop ( ) ) , ( alo = _ref1 [ 0 ] ) , ( ahi = _ref1 [ 1 ] ) , ( blo = _ref1 [ 2 ] ) , ( bhi = _ref1 [ 3 ] ) ; ( _ref2 = x = this . findLongestMatch ( alo , ahi , blo , bhi ) ) , ( i = _ref2 [ 0 ] ) , ( j = _ref2 [ 1 ] ) , ( k = _ref2 [ 2 ] ) ; if ( k ) { matchingBlocks . push ( x ) ; if ( alo < i && blo < j ) { queue . push ( [ alo , i , blo , j ] ) ; } if ( i + k < ahi && j + k < bhi ) { queue . push ( [ i + k , ahi , j + k , bhi ] ) ; } } } matchingBlocks . sort ( _arrayCmp ) ; i1 = j1 = k1 = 0 ; nonAdjacent = [ ] ; for ( _i = 0 , _len = matchingBlocks . length ; _i < _len ; _i ++ ) { ( _ref3 = matchingBlocks [ _i ] ) , ( i2 = _ref3 [ 0 ] ) , ( j2 = _ref3 [ 1 ] ) , ( k2 = _ref3 [ 2 ] ) ; if ( i1 + k1 === i2 && j1 + k1 === j2 ) { k1 += k2 ; } else { if ( k1 ) { nonAdjacent . push ( [ i1 , j1 , k1 ] ) ; } ( _ref4 = [ i2 , j2 , k2 ] ) , ( i1 = _ref4 [ 0 ] ) , ( j1 = _ref4 [ 1 ] ) , ( k1 = _ref4 [ 2 ] ) ; } } if ( k1 ) { nonAdjacent . push ( [ i1 , j1 , k1 ] ) ; } nonAdjacent . push ( [ la , lb , 0 ] ) ; return ( this . matchingBlocks = nonAdjacent ) ; } ; SequenceMatcher . prototype . getOpcodes = function ( ) { let ai , answer , bj , i , j , size , tag , _i , _len , _ref , _ref1 , _ref2 ; if ( this . opcodes ) { return this . opcodes ; } i = j = 0 ; this . opcodes = answer = [ ] ; _ref = this . getMatchingBlocks ( ) ; for ( _i = 0 , _len = _ref . length ; _i < _len ; _i ++ ) { ( _ref1 = _ref [ _i ] ) , ( ai = _ref1 [ 0 ] ) , ( bj = _ref1 [ 1 ] ) , ( size = _ref1 [ 2 ] ) ; tag = "" ; if ( i < ai && j < bj ) { tag = "replace" ; } else if ( i < ai ) { tag = "delete" ; } else if ( j < bj ) { tag = "insert" ; } if ( tag ) { answer . push ( [ tag , i , ai , j , bj ] ) ; } ( _ref2 = [ ai + size , bj + size ] ) , ( i = _ref2 [ 0 ] ) , ( j = _ref2 [ 1 ] ) ; if ( size ) { answer . push ( [ "equal" , ai , i , bj , j ] ) ; } } return answer ; } ; SequenceMatcher . prototype . getGroupedOpcodes = function ( n ) { let codes , group , groups , i1 , i2 , j1 , j2 , nn , tag , _i , _len , _ref , _ref1 , _ref2 , _ref3 ; if ( n == null ) { n = 3 ; } codes = this . getOpcodes ( ) ; if ( ! codes . length ) { codes = [ [ "equal" , 0 , 1 , 0 , 1 ] ] ; } if ( codes [ 0 ] [ 0 ] === "equal" ) { ( _ref = codes [ 0 ] ) , ( tag = _ref [ 0 ] ) , ( i1 = _ref [ 1 ] ) , ( i2 = _ref [ 2 ] ) , ( j1 = _ref [ 3 ] ) , ( j2 = _ref [ 4 ] ) ; codes [ 0 ] = [ tag , max ( i1 , i2 - n ) , i2 , max ( j1 , j2 - n ) , j2 ] ; } if ( codes [ codes . length - 1 ] [ 0 ] === "equal" ) { ( _ref1 = codes [ codes . length - 1 ] ) , ( tag = _ref1 [ 0 ] ) , ( i1 = _ref1 [ 1 ] ) , ( i2 = _ref1 [ 2 ] ) , ( j1 = _ref1 [ 3 ] ) , ( j2 = _ref1 [ 4 ] ) ; codes [ codes . length - 1 ] = [ tag , i1 , min ( i2 , i1 + n ) , j1 , min ( j2 , j1 + n ) ] ; } nn = n + n ; groups = [ ] ; group = [ ] ; for ( _i = 0 , _len = codes . length ; _i < _len ; _i ++ ) { ( _ref2 = codes [ _i ] ) , ( tag = _ref2 [ 0 ] ) , ( i1 = _ref2 [ 1 ] ) , ( i2 = _ref2 [ 2 ] ) , ( j1 = _ref2 [ 3 ] ) , ( j2 = _ref2 [ 4 ] ) ; if ( tag === "equal" && i2 - i1 > nn ) { group . push ( [ tag , i1 , min ( i2 , i1 + n ) , j1 , min ( j2 , j1 + n ) ] ) ; groups . push ( group ) ; group = [ ] ; ( _ref3 = [ max ( i1 , i2 - n ) , max ( j1 , j2 - n ) ] ) , ( i1 = _ref3 [ 0 ] ) , ( j1 = _ref3 [ 1 ] ) ; } group . push ( [ tag , i1 , i2 , j1 , j2 ] ) ; } if ( group . length && ! ( group . length === 1 && group [ 0 ] [ 0 ] === "equal" ) ) { groups . push ( group ) ; } return groups ; } ; SequenceMatcher . prototype . ratio = function ( ) { let match , matches , _i , _len , _ref ; matches = 0 ; _ref = this . getMatchingBlocks ( ) ; for ( _i = 0 , _len = _ref . length ; _i < _len ; _i ++ ) { match = _ref [ _i ] ; matches += match [ 2 ] ; } return _calculateRatio ( matches , this . a . length + this . b . length ) ; } ; SequenceMatcher . prototype . quickRatio = function ( ) { let avail , elt , fullbcount , matches , numb , _i , _j , _len , _len1 , _ref , _ref1 ; if ( ! this . fullbcount ) { this . fullbcount = fullbcount = { } ; _ref = this . b ; for ( _i = 0 , _len = _ref . length ; _i < _len ; _i ++ ) { elt = _ref [ _i ] ; fullbcount [ elt ] = ( fullbcount [ elt ] || 0 ) + 1 ; } } fullbcount = this . fullbcount ; avail = { } ; matches = 0 ; _ref1 = this . a ; for ( _j = 0 , _len1 = _ref1 . length ; _j < _len1 ; _j ++ ) { elt = _ref1 [ _j ] ; if ( _has ( avail , elt ) ) { numb = avail [ elt ] ; } else { numb = fullbcount [ elt ] || 0 ; } avail [ elt ] = numb - 1 ; if ( numb > 0 ) { matches ++ ; } } return _calculateRatio ( matches , this . a . length + this . b . length ) ; } ; SequenceMatcher . prototype . realQuickRatio = function ( ) { let la , lb , _ref ; ( _ref = [ this . a . length , this . b . length ] ) , ( la = _ref [ 0 ] ) , ( lb = _ref [ 1 ] ) ; return _calculateRatio ( min ( la , lb ) , la + lb ) ; } ; return SequenceMatcher ; } ) ( ) ; _countLeading = function ( line , ch ) { let i , n , _ref ; ( _ref = [ 0 , line . length ] ) , ( i = _ref [ 0 ] ) , ( n = _ref [ 1 ] ) ; while ( i < n && line [ i ] === ch ) { i ++ ; } return i ; } ; Differ = ( function ( ) { function Differ ( linejunk , charjunk ) { this . linejunk = linejunk ; this . charjunk = charjunk ; } Differ . prototype . compare = function ( a , b ) { let ahi , alo , bhi , blo , cruncher , g , line , lines , tag , _i , _j , _len , _len1 , _ref , _ref1 ; cruncher = new SequenceMatcher ( this . linejunk , a , b ) ; lines = [ ] ; _ref = cruncher . getOpcodes ( ) ; for ( _i = 0 , _len = _ref . length ; _i < _len ; _i ++ ) { ( _ref1 = _ref [ _i ] ) , ( tag = _ref1 [ 0 ] ) , ( alo = _ref1 [ 1 ] ) , ( ahi = _ref1 [ 2 ] ) , ( blo = _ref1 [ 3 ] ) , ( bhi = _ref1 [ 4 ] ) ; switch ( tag ) { case "replace" : g = this . _fancyReplace ( a , alo , ahi , b , blo , bhi ) ; break ; case "delete" : g = this . _dump ( "-" , a , alo , ahi ) ; break ; case "insert" : g = this . _dump ( "+" , b , blo , bhi ) ; break ; case "equal" : g = this . _dump ( " " , a , alo , ahi ) ; break ; default : throw new Error ( "unknow tag (" + tag + ")" ) ; } for ( _j = 0 , _len1 = g . length ; _j < _len1 ; _j ++ ) { line = g [ _j ] ; lines . push ( line ) ; } } return lines ; } ; Differ . prototype . _dump = function ( tag , x , lo , hi ) { let i , _i , _results ; _results = [ ] ; for ( i = _i = lo ; lo <= hi ? _i < hi : _i > hi ; i = lo <= hi ? ++ _i : -- _i ) { _results . push ( "" + tag + " " + x [ i ] ) ; } return _results ; } ; Differ . prototype . _plainReplace = function ( a , alo , ahi , b , blo , bhi ) { let first , g , line , lines , second , _i , _j , _len , _len1 , _ref ; if ( bhi - blo < ahi - alo ) { first = this . _dump ( "+" , b , blo , bhi ) ; second = this . _dump ( "-" , a , alo , ahi ) ; } else { first = this . _dump ( "-" , a , alo , ahi ) ; second = this . _dump ( "+" , b , blo , bhi ) ; } lines = [ ] ; _ref = [ first , second ] ; for ( _i = 0 , _len = _ref . length ; _i < _len ; _i ++ ) { g = _ref [ _i ] ; for ( _j = 0 , _len1 = g . length ; _j < _len1 ; _j ++ ) { line = g [ _j ] ; lines . push ( line ) ; } } return lines ; } ; Differ . prototype . _fancyReplace = function ( a , alo , ahi , b , blo , bhi ) { let aelt , ai , ai1 , ai2 , atags , belt , bestRatio , besti , bestj , bj , bj1 , bj2 , btags , cruncher , cutoff , eqi , eqj , i , j , la , lb , line , lines , tag , _i , _j , _k , _l , _len , _len1 , _len2 , _len3 , _len4 , _m , _n , _o , _ref , _ref1 , _ref10 , _ref11 , _ref12 , _ref2 , _ref3 , _ref4 , _ref5 , _ref6 , _ref7 , _ref8 , _ref9 ; ( _ref = [ 0.74 , 0.75 ] ) , ( bestRatio = _ref [ 0 ] ) , ( cutoff = _ref [ 1 ] ) ; cruncher = new SequenceMatcher ( this . charjunk ) ; ( _ref1 = [ null , null ] ) , ( eqi = _ref1 [ 0 ] ) , ( eqj = _ref1 [ 1 ] ) ; lines = [ ] ; for ( j = _i = blo ; blo <= bhi ? _i < bhi : _i > bhi ; j = blo <= bhi ? ++ _i : -- _i ) { bj = b [ j ] ; cruncher . setSeq2 ( bj ) ; for ( i = _j = alo ; alo <= ahi ? _j < ahi : _j > ahi ; i = alo <= ahi ? ++ _j : -- _j ) { ai = a [ i ] ; if ( ai === bj ) { if ( eqi === null ) { ( _ref2 = [ i , j ] ) , ( eqi = _ref2 [ 0 ] ) , ( eqj = _ref2 [ 1 ] ) ; } continue ; } cruncher . setSeq1 ( ai ) ; if ( cruncher . realQuickRatio ( ) > bestRatio && cruncher . quickRatio ( ) > bestRatio && cruncher . ratio ( ) > bestRatio ) { ( _ref3 = [ cruncher . ratio ( ) , i , j ] ) , ( bestRatio = _ref3 [ 0 ] ) , ( besti = _ref3 [ 1 ] ) , ( bestj = _ref3 [ 2 ] ) ; } } } if ( bestRatio < cutoff ) { if ( eqi === null ) { _ref4 = this . _plainReplace ( a , alo , ahi , b , blo , bhi ) ; for ( _k = 0 , _len = _ref4 . length ; _k < _len ; _k ++ ) { line = _ref4 [ _k ] ; lines . push ( line ) ; } return lines ; } ( _ref5 = [ eqi , eqj , 1.0 ] ) , ( besti = _ref5 [ 0 ] ) , ( bestj = _ref5 [ 1 ] ) , ( bestRatio = _ref5 [ 2 ] ) ; } else { eqi = null ; } _ref6 = this . _fancyHelper ( a , alo , besti , b , blo , bestj ) ; for ( _l = 0 , _len1 = _ref6 . length ; _l < _len1 ; _l ++ ) { line = _ref6 [ _l ] ; lines . push ( line ) ; } ( _ref7 = [ a [ besti ] , b [ bestj ] ] ) , ( aelt = _ref7 [ 0 ] ) , ( belt = _ref7 [ 1 ] ) ; if ( eqi === null ) { atags = btags = "" ; cruncher . setSeqs ( aelt , belt ) ; _ref8 = cruncher . getOpcodes ( ) ; for ( _m = 0 , _len2 = _ref8 . length ; _m < _len2 ; _m ++ ) { ( _ref9 = _ref8 [ _m ] ) , ( tag = _ref9 [ 0 ] ) , ( ai1 = _ref9 [ 1 ] ) , ( ai2 = _ref9 [ 2 ] ) , ( bj1 = _ref9 [ 3 ] ) , ( bj2 = _ref9 [ 4 ] ) ; ( _ref10 = [ ai2 - ai1 , bj2 - bj1 ] ) , ( la = _ref10 [ 0 ] ) , ( lb = _ref10 [ 1 ] ) ; switch ( tag ) { case "replace" : atags += Array ( la + 1 ) . join ( "^" ) ; btags += Array ( lb + 1 ) . join ( "^" ) ; break ; case "delete" : atags += Array ( la + 1 ) . join ( "-" ) ; break ; case "insert" : btags += Array ( lb + 1 ) . join ( "+" ) ; break ; case "equal" : atags += Array ( la + 1 ) . join ( " " ) ; btags += Array ( lb + 1 ) . join ( " " ) ; break ; default : throw new Error ( "unknow tag (" + tag + ")" ) ; } } _ref11 = this . _qformat ( aelt , belt , atags , btags ) ; for ( _n = 0 , _len3 = _ref11 . length ; _n < _len3 ; _n ++ ) { line = _ref11 [ _n ] ; lines . push ( line ) ; } } else { lines . push ( "  " + aelt ) ; } _ref12 = this . _fancyHelper ( a , besti + 1 , ahi , b , bestj + 1 , bhi ) ; for ( _o = 0 , _len4 = _ref12 . length ; _o < _len4 ; _o ++ ) { line = _ref12 [ _o ] ; lines . push ( line ) ; } return lines ; } ; Differ . prototype . _fancyHelper = function ( a , alo , ahi , b , blo , bhi ) { let g ; g = [ ] ; if ( alo < ahi ) { if ( blo < bhi ) { g = this . _fancyReplace ( a , alo , ahi , b , blo , bhi ) ; } else { g = this . _dump ( "-" , a , alo , ahi ) ; } } else if ( blo < bhi ) { g = this . _dump ( "+" , b , blo , bhi ) ; } return g ; } ; Differ . prototype . _qformat = function ( aline , bline , atags , btags ) { let common , lines ; lines = [ ] ; common = min ( _countLeading ( aline , "\t" ) , _countLeading ( bline , "\t" ) ) ; common = min ( common , _countLeading ( atags . slice ( 0 , common ) , " " ) ) ; common = min ( common , _countLeading ( btags . slice ( 0 , common ) , " " ) ) ; atags = atags . slice ( common ) . replace ( /\s+$/ , "" ) ; btags = btags . slice ( common ) . replace ( /\s+$/ , "" ) ; lines . push ( "- " + aline ) ; if ( atags . length ) { lines . push ( "? " + Array ( common + 1 ) . join ( "\t" ) + atags + "\n" ) ; } lines . push ( "+ " + bline ) ; if ( btags . length ) { lines . push ( "? " + Array ( common + 1 ) . join ( "\t" ) + btags + "\n" ) ; } return lines ; } ; return Differ ; } ) ( ) ; IS_LINE_JUNK = function ( line , pat ) { if ( pat == null ) { pat = /^\s*#?\s*$/ ; } return pat . test ( line ) ; } ; IS_CHARACTER_JUNK = function ( ch , ws ) { if ( ws == null ) { ws = " \t" ; } return __indexOf . call ( ws , ch ) >= 0 ; } ; _formatRangeUnified = function ( start , stop ) { let beginning , length ; beginning = start + 1 ; length = stop - start ; if ( length === 1 ) { return "" + beginning ; } if ( ! length ) { beginning -- ; } return "" + beginning + "," + length ; } ; unifiedDiff = function ( a , b , _arg ) { let file1Range , file2Range , first , fromdate , fromfile , fromfiledate , group , i1 , i2 , j1 , j2 , last , line , lines , lineterm , n , started , tag , todate , tofile , tofiledate , _i , _j , _k , _l , _len , _len1 , _len2 , _len3 , _len4 , _m , _ref , _ref1 , _ref2 , _ref3 , _ref4 , _ref5 , _ref6 ; ( _ref = _arg != null ? _arg : { } ) , ( fromfile = _ref . fromfile ) , ( tofile = _ref . tofile ) , ( fromfiledate = _ref . fromfiledate ) , ( tofiledate = _ref . tofiledate ) , ( n = _ref . n ) , ( lineterm = _ref . lineterm ) ; if ( fromfile == null ) { fromfile = "" ; } if ( tofile == null ) { tofile = "" ; } if ( fromfiledate == null ) { fromfiledate = "" ; } if ( tofiledate == null ) { tofiledate = "" ; } if ( n == null ) { n = 3 ; } if ( lineterm == null ) { lineterm = "\n" ; } lines = [ ] ; started = false ; _ref1 = new SequenceMatcher ( null , a , b ) . getGroupedOpcodes ( ) ; for ( _i = 0 , _len = _ref1 . length ; _i < _len ; _i ++ ) { group = _ref1 [ _i ] ; if ( ! started ) { started = true ; fromdate = fromfiledate ? "\t" + fromfiledate : "" ; todate = tofiledate ? "\t" + tofiledate : "" ; lines . push ( "--- " + fromfile + fromdate + lineterm ) ; lines . push ( "+++ " + tofile + todate + lineterm ) ; } ( _ref2 = [ group [ 0 ] , group [ group . length - 1 ] ] ) , ( first = _ref2 [ 0 ] ) , ( last = _ref2 [ 1 ] ) ; file1Range = _formatRangeUnified ( first [ 1 ] , last [ 2 ] ) ; file2Range = _formatRangeUnified ( first [ 3 ] , last [ 4 ] ) ; lines . push ( "@@ -" + file1Range + " +" + file2Range + " @@" + lineterm ) ; for ( _j = 0 , _len1 = group . length ; _j < _len1 ; _j ++ ) { ( _ref3 = group [ _j ] ) , ( tag = _ref3 [ 0 ] ) , ( i1 = _ref3 [ 1 ] ) , ( i2 = _ref3 [ 2 ] ) , ( j1 = _ref3 [ 3 ] ) , ( j2 = _ref3 [ 4 ] ) ; if ( tag === "equal" ) { _ref4 = a . slice ( i1 , i2 ) ; for ( _k = 0 , _len2 = _ref4 . length ; _k < _len2 ; _k ++ ) { line = _ref4 [ _k ] ; lines . push ( " " + line ) ; } continue ; } if ( tag === "replace" || tag === "delete" ) { _ref5 = a . slice ( i1 , i2 ) ; for ( _l = 0 , _len3 = _ref5 . length ; _l < _len3 ; _l ++ ) { line = _ref5 [ _l ] ; lines . push ( "-" + line ) ; } } if ( tag === "replace" || tag === "insert" ) { _ref6 = b . slice ( j1 , j2 ) ; for ( _m = 0 , _len4 = _ref6 . length ; _m < _len4 ; _m ++ ) { line = _ref6 [ _m ] ; lines . push ( "+" + line ) ; } } } } return lines ; } ; _formatRangeContext = function ( start , stop ) { let beginning , length ; beginning = start + 1 ; length = stop - start ; if ( ! length ) { beginning -- ; } if ( length <= 1 ) { return "" + beginning ; } return "" + beginning + "," + ( beginning + length - 1 ) ; } ; contextDiff = function ( a , b , _arg ) { let file1Range , file2Range , first , fromdate , fromfile , fromfiledate , group , i1 , i2 , j1 , j2 , last , line , lines , lineterm , n , prefix , started , tag , todate , tofile , tofiledate , _ , _i , _j , _k , _l , _len , _len1 , _len2 , _len3 , _len4 , _m , _ref , _ref1 , _ref2 , _ref3 , _ref4 , _ref5 , _ref6 ; ( _ref = _arg != null ? _arg : { } ) , ( fromfile = _ref . fromfile ) , ( tofile = _ref . tofile ) , ( fromfiledate = _ref . fromfiledate ) , ( tofiledate = _ref . tofiledate ) , ( n = _ref . n ) , ( lineterm = _ref . lineterm ) ; if ( fromfile == null ) { fromfile = "" ; } if ( tofile == null ) { tofile = "" ; } if ( fromfiledate == null ) { fromfiledate = "" ; } if ( tofiledate == null ) { tofiledate = "" ; } if ( n == null ) { n = 3 ; } if ( lineterm == null ) { lineterm = "\n" ; } prefix = { insert : "+ " , delete : "- " , replace : "! " , equal : "  " } ; started = false ; lines = [ ] ; _ref1 = new SequenceMatcher ( null , a , b ) . getGroupedOpcodes ( ) ; for ( _i = 0 , _len = _ref1 . length ; _i < _len ; _i ++ ) { group = _ref1 [ _i ] ; if ( ! started ) { started = true ; fromdate = fromfiledate ? "\t" + fromfiledate : "" ; todate = tofiledate ? "\t" + tofiledate : "" ; lines . push ( "*** " + fromfile + fromdate + lineterm ) ; lines . push ( "--- " + tofile + todate + lineterm ) ; ( _ref2 = [ group [ 0 ] , group [ group . length - 1 ] ] ) , ( first = _ref2 [ 0 ] ) , ( last = _ref2 [ 1 ] ) ; lines . push ( "***************" + lineterm ) ; file1Range = _formatRangeContext ( first [ 1 ] , last [ 2 ] ) ; lines . push ( "*** " + file1Range + " ****" + lineterm ) ; if ( _any ( ( function ( ) { let _j , _len1 , _ref3 , _results ; _results = [ ] ; for ( _j = 0 , _len1 = group . length ; _j < _len1 ; _j ++ ) { ( _ref3 = group [ _j ] ) , ( tag = _ref3 [ 0 ] ) , ( _ = _ref3 [ 1 ] ) , ( _ = _ref3 [ 2 ] ) , ( _ = _ref3 [ 3 ] ) , ( _ = _ref3 [ 4 ] ) ; _results . push ( tag === "replace" || tag === "delete" ) ; } return _results ; } ) ( ) ) ) { for ( _j = 0 , _len1 = group . length ; _j < _len1 ; _j ++ ) { ( _ref3 = group [ _j ] ) , ( tag = _ref3 [ 0 ] ) , ( i1 = _ref3 [ 1 ] ) , ( i2 = _ref3 [ 2 ] ) , ( _ = _ref3 [ 3 ] ) , ( _ = _ref3 [ 4 ] ) ; if ( tag !== "insert" ) { _ref4 = a . slice ( i1 , i2 ) ; for ( _k = 0 , _len2 = _ref4 . length ; _k < _len2 ; _k ++ ) { line = _ref4 [ _k ] ; lines . push ( prefix [ tag ] + line ) ; } } } } file2Range = _formatRangeContext ( first [ 3 ] , last [ 4 ] ) ; lines . push ( "--- " + file2Range + " ----" + lineterm ) ; if ( _any ( ( function ( ) { let _l , _len3 , _ref5 , _results ; _results = [ ] ; for ( _l = 0 , _len3 = group . length ; _l < _len3 ; _l ++ ) { ( _ref5 = group [ _l ] ) , ( tag = _ref5 [ 0 ] ) , ( _ = _ref5 [ 1 ] ) , ( _ = _ref5 [ 2 ] ) , ( _ = _ref5 [ 3 ] ) , ( _ = _ref5 [ 4 ] ) ; _results . push ( tag === "replace" || tag === "insert" ) ; } return _results ; } ) ( ) ) ) { for ( _l = 0 , _len3 = group . length ; _l < _len3 ; _l ++ ) { ( _ref5 = group [ _l ] ) , ( tag = _ref5 [ 0 ] ) , ( _ = _ref5 [ 1 ] ) , ( _ = _ref5 [ 2 ] ) , ( j1 = _ref5 [ 3 ] ) , ( j2 = _ref5 [ 4 ] ) ; if ( tag !== "delete" ) { _ref6 = b . slice ( j1 , j2 ) ; for ( _m = 0 , _len4 = _ref6 . length ; _m < _len4 ; _m ++ ) { line = _ref6 [ _m ] ; lines . push ( prefix [ tag ] + line ) ; } } } } } } return lines ; } ; ndiff = function ( a , b , linejunk , charjunk ) { if ( charjunk == null ) { charjunk = IS_CHARACTER_JUNK ; } return new Differ ( linejunk , charjunk ) . compare ( a , b ) ; } ; restore = function ( delta , which ) { let line , lines , prefixes , tag , _i , _len , _ref ; tag = { 1 : "- " , 2 : "+ " } [ which ] ; if ( ! tag ) { throw new Error ( "unknow delta choice (must be 1 or 2): " + which ) ; } prefixes = [ "  " , tag ] ; lines = [ ] ; for ( _i = 0 , _len = delta . length ; _i < _len ; _i ++ ) { line = delta [ _i ] ; if ( ( ( _ref = line . slice ( 0 , 2 ) ) , __indexOf . call ( prefixes , _ref ) >= 0 ) ) { lines . push ( line . slice ( 2 ) ) ; } } return lines ; } ; export { SequenceMatcher , Differ , IS_LINE_JUNK , IS_CHARACTER_JUNK , unifiedDiff , contextDiff , ndiff , restore } ;