2021-09-12 11:11:48 +00:00
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */
/*exported XLSX */
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
var XLSX = { } ;
2021-10-13 07:20:25 +00:00
XLSX . version = '0.17.3' ;
2021-09-12 11:11:48 +00:00
var current _codepage = 1200 , current _ansi = 1252 ;
var VALID _ANSI = [ 874 , 932 , 936 , 949 , 950 ] ;
for ( var i = 0 ; i <= 8 ; ++ i ) VALID _ANSI . push ( 1250 + i ) ;
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */
var CS2CP = ( {
/*::[*/ 0 /*::]*/ : 1252 , /* ANSI */
/*::[*/ 1 /*::]*/ : 65001 , /* DEFAULT */
/*::[*/ 2 /*::]*/ : 65001 , /* SYMBOL */
/*::[*/ 77 /*::]*/ : 10000 , /* MAC */
/*::[*/ 128 /*::]*/ : 932 , /* SHIFTJIS */
/*::[*/ 129 /*::]*/ : 949 , /* HANGUL */
/*::[*/ 130 /*::]*/ : 1361 , /* JOHAB */
/*::[*/ 134 /*::]*/ : 936 , /* GB2312 */
/*::[*/ 136 /*::]*/ : 950 , /* CHINESEBIG5 */
/*::[*/ 161 /*::]*/ : 1253 , /* GREEK */
/*::[*/ 162 /*::]*/ : 1254 , /* TURKISH */
/*::[*/ 163 /*::]*/ : 1258 , /* VIETNAMESE */
/*::[*/ 177 /*::]*/ : 1255 , /* HEBREW */
/*::[*/ 178 /*::]*/ : 1256 , /* ARABIC */
/*::[*/ 186 /*::]*/ : 1257 , /* BALTIC */
/*::[*/ 204 /*::]*/ : 1251 , /* RUSSIAN */
/*::[*/ 222 /*::]*/ : 874 , /* THAI */
/*::[*/ 238 /*::]*/ : 1250 , /* EASTEUROPE */
/*::[*/ 255 /*::]*/ : 1252 , /* OEM */
/*::[*/ 69 /*::]*/ : 6969 /* MISC */
} /*:any*/ ) ;
var set _ansi = function ( cp /*:number*/ ) { if ( VALID _ANSI . indexOf ( cp ) == - 1 ) return ; current _ansi = CS2CP [ 0 ] = cp ; } ;
function reset _ansi ( ) { set _ansi ( 1252 ) ; }
var set _cp = function ( cp /*:number*/ ) { current _codepage = cp ; set _ansi ( cp ) ; } ;
function reset _cp ( ) { set _cp ( 1200 ) ; reset _ansi ( ) ; }
function char _codes ( data /*:string*/ ) /*:Array<number>*/ { var o /*:Array<number>*/ = [ ] ; for ( var i = 0 , len = data . length ; i < len ; ++ i ) o [ i ] = data . charCodeAt ( i ) ; return o ; }
function utf16leread ( data /*:string*/ ) /*:string*/ {
var o /*:Array<string>*/ = [ ] ;
for ( var i = 0 ; i < ( data . length >> 1 ) ; ++ i ) o [ i ] = String . fromCharCode ( data . charCodeAt ( 2 * i ) + ( data . charCodeAt ( 2 * i + 1 ) << 8 ) ) ;
return o . join ( "" ) ;
}
function utf16beread ( data /*:string*/ ) /*:string*/ {
var o /*:Array<string>*/ = [ ] ;
for ( var i = 0 ; i < ( data . length >> 1 ) ; ++ i ) o [ i ] = String . fromCharCode ( data . charCodeAt ( 2 * i + 1 ) + ( data . charCodeAt ( 2 * i ) << 8 ) ) ;
return o . join ( "" ) ;
}
var debom = function ( data /*:string*/ ) /*:string*/ {
var c1 = data . charCodeAt ( 0 ) , c2 = data . charCodeAt ( 1 ) ;
if ( c1 == 0xFF && c2 == 0xFE ) return utf16leread ( data . slice ( 2 ) ) ;
if ( c1 == 0xFE && c2 == 0xFF ) return utf16beread ( data . slice ( 2 ) ) ;
if ( c1 == 0xFEFF ) return data . slice ( 1 ) ;
return data ;
} ;
var _getchar = function _gc1 ( x /*:number*/ ) /*:string*/ { return String . fromCharCode ( x ) ; } ;
var _getansi = function _ga1 ( x /*:number*/ ) /*:string*/ { return String . fromCharCode ( x ) ; } ;
var DENSE = null ;
var DIF _XL = true ;
var Base64 = ( function make _b64 ( ) {
var map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" ;
return {
encode : function ( input /*:string*/ ) /*:string*/ {
var o = "" ;
var c1 = 0 , c2 = 0 , c3 = 0 , e1 = 0 , e2 = 0 , e3 = 0 , e4 = 0 ;
for ( var i = 0 ; i < input . length ; ) {
c1 = input . charCodeAt ( i ++ ) ;
e1 = ( c1 >> 2 ) ;
c2 = input . charCodeAt ( i ++ ) ;
e2 = ( ( c1 & 3 ) << 4 ) | ( c2 >> 4 ) ;
c3 = input . charCodeAt ( i ++ ) ;
e3 = ( ( c2 & 15 ) << 2 ) | ( c3 >> 6 ) ;
e4 = ( c3 & 63 ) ;
if ( isNaN ( c2 ) ) { e3 = e4 = 64 ; }
else if ( isNaN ( c3 ) ) { e4 = 64 ; }
o += map . charAt ( e1 ) + map . charAt ( e2 ) + map . charAt ( e3 ) + map . charAt ( e4 ) ;
}
return o ;
} ,
decode : function b64 _decode ( input /*:string*/ ) /*:string*/ {
var o = "" ;
var c1 = 0 , c2 = 0 , c3 = 0 , e1 = 0 , e2 = 0 , e3 = 0 , e4 = 0 ;
input = input . replace ( /[^\w\+\/\=]/g , "" ) ;
for ( var i = 0 ; i < input . length ; ) {
e1 = map . indexOf ( input . charAt ( i ++ ) ) ;
e2 = map . indexOf ( input . charAt ( i ++ ) ) ;
c1 = ( e1 << 2 ) | ( e2 >> 4 ) ;
o += String . fromCharCode ( c1 ) ;
e3 = map . indexOf ( input . charAt ( i ++ ) ) ;
c2 = ( ( e2 & 15 ) << 4 ) | ( e3 >> 2 ) ;
if ( e3 !== 64 ) { o += String . fromCharCode ( c2 ) ; }
e4 = map . indexOf ( input . charAt ( i ++ ) ) ;
c3 = ( ( e3 & 3 ) << 6 ) | e4 ;
if ( e4 !== 64 ) { o += String . fromCharCode ( c3 ) ; }
}
return o ;
}
} ;
} ) ( ) ;
var has _buf = ( typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process . versions !== 'undefined' && ! ! process . versions . node ) ;
var Buffer _from = /*::(*/ function ( ) { } /*:: :any)*/ ;
if ( typeof Buffer !== 'undefined' ) {
var nbfs = ! Buffer . from ;
if ( ! nbfs ) try { Buffer . from ( "foo" , "utf8" ) ; } catch ( e ) { nbfs = true ; }
Buffer _from = nbfs ? function ( buf , enc ) { return ( enc ) ? new Buffer ( buf , enc ) : new Buffer ( buf ) ; } : Buffer . from . bind ( Buffer ) ;
// $FlowIgnore
if ( ! Buffer . alloc ) Buffer . alloc = function ( n ) { return new Buffer ( n ) ; } ;
// $FlowIgnore
if ( ! Buffer . allocUnsafe ) Buffer . allocUnsafe = function ( n ) { return new Buffer ( n ) ; } ;
}
function new _raw _buf ( len /*:number*/ ) {
/* jshint -W056 */
return has _buf ? Buffer . alloc ( len ) : new Array ( len ) ;
/* jshint +W056 */
}
function new _unsafe _buf ( len /*:number*/ ) {
/* jshint -W056 */
return has _buf ? Buffer . allocUnsafe ( len ) : new Array ( len ) ;
/* jshint +W056 */
}
var s2a = function s2a ( s /*:string*/ ) /*:any*/ {
if ( has _buf ) return Buffer _from ( s , "binary" ) ;
return s . split ( "" ) . map ( function ( x /*:string*/ ) /*:number*/ { return x . charCodeAt ( 0 ) & 0xff ; } ) ;
} ;
function s2ab ( s /*:string*/ ) /*:any*/ {
if ( typeof ArrayBuffer === 'undefined' ) return s2a ( s ) ;
var buf = new ArrayBuffer ( s . length ) , view = new Uint8Array ( buf ) ;
for ( var i = 0 ; i != s . length ; ++ i ) view [ i ] = s . charCodeAt ( i ) & 0xFF ;
return buf ;
}
function a2s ( data /*:any*/ ) /*:string*/ {
if ( Array . isArray ( data ) ) return data . map ( function ( c ) { return String . fromCharCode ( c ) ; } ) . join ( "" ) ;
var o /*:Array<string>*/ = [ ] ; for ( var i = 0 ; i < data . length ; ++ i ) o [ i ] = String . fromCharCode ( data [ i ] ) ; return o . join ( "" ) ;
}
function a2u ( data /*:Array<number>*/ ) /*:Uint8Array*/ {
if ( typeof Uint8Array === 'undefined' ) throw new Error ( "Unsupported" ) ;
return new Uint8Array ( data ) ;
}
function ab2a ( data /*:ArrayBuffer|Uint8Array*/ ) /*:Array<number>*/ {
if ( typeof ArrayBuffer == 'undefined' ) throw new Error ( "Unsupported" ) ;
if ( data instanceof ArrayBuffer ) return ab2a ( new Uint8Array ( data ) ) ;
/*:: if(data instanceof ArrayBuffer) throw new Error("unreachable"); */
var o = new Array ( data . length ) ;
for ( var i = 0 ; i < data . length ; ++ i ) o [ i ] = data [ i ] ;
return o ;
}
var bconcat = function ( bufs ) { return [ ] . concat . apply ( [ ] , bufs ) ; } ;
var chr0 = /\u0000/g , chr1 = /[\u0001-\u0006]/g ;
/ * : :
declare type Block = any ;
declare type BufArray = {
newblk ( sz : number ) : Block ;
next ( sz : number ) : Block ;
end ( ) : any ;
push ( buf : Block ) : void ;
} ;
type RecordHopperCB = { ( d : any , Rn : string , RT : number ) : ? boolean ; } ;
type EvertType = { [ string ] : string } ;
type EvertNumType = { [ string ] : number } ;
type EvertArrType = { [ string ] : Array < string > } ;
type StringConv = { ( string ) : string } ;
type WriteObjStrFactory = { from _sheet ( ws : Worksheet , o : any , wb : ? Workbook ) : string } ;
* /
/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
/*jshint -W041 */
var SSF /*:SSFModule*/ = ( { } /*:any*/ ) ;
var make _ssf = function make _ssf ( SSF /*:SSFModule*/ ) {
SSF . version = '0.11.2' ;
function _strrev ( x /*:string*/ ) /*:string*/ { var o = "" , i = x . length - 1 ; while ( i >= 0 ) o += x . charAt ( i -- ) ; return o ; }
function fill ( c /*:string*/ , l /*:number*/ ) /*:string*/ { var o = "" ; while ( o . length < l ) o += c ; return o ; }
function pad0 ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + v ; return t . length >= d ? t : fill ( '0' , d - t . length ) + t ; }
function pad _ ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + v ; return t . length >= d ? t : fill ( ' ' , d - t . length ) + t ; }
function rpad _ ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + v ; return t . length >= d ? t : t + fill ( ' ' , d - t . length ) ; }
function pad0r1 ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + Math . round ( v ) ; return t . length >= d ? t : fill ( '0' , d - t . length ) + t ; }
function pad0r2 ( v /*:any*/ , d /*:number*/ ) /*:string*/ { var t = "" + v ; return t . length >= d ? t : fill ( '0' , d - t . length ) + t ; }
var p2 _32 = Math . pow ( 2 , 32 ) ;
function pad0r ( v /*:any*/ , d /*:number*/ ) /*:string*/ { if ( v > p2 _32 || v < - p2 _32 ) return pad0r1 ( v , d ) ; var i = Math . round ( v ) ; return pad0r2 ( i , d ) ; }
function isgeneral ( s /*:string*/ , i /*:?number*/ ) /*:boolean*/ { i = i || 0 ; return s . length >= 7 + i && ( s . charCodeAt ( i ) | 32 ) === 103 && ( s . charCodeAt ( i + 1 ) | 32 ) === 101 && ( s . charCodeAt ( i + 2 ) | 32 ) === 110 && ( s . charCodeAt ( i + 3 ) | 32 ) === 101 && ( s . charCodeAt ( i + 4 ) | 32 ) === 114 && ( s . charCodeAt ( i + 5 ) | 32 ) === 97 && ( s . charCodeAt ( i + 6 ) | 32 ) === 108 ; }
/ * : :
type SSF _write _num = { ( type : string , fmt : string , val : number ) : string } ;
* /
var days /*:Array<Array<string> >*/ = [
[ 'Sun' , 'Sunday' ] ,
[ 'Mon' , 'Monday' ] ,
[ 'Tue' , 'Tuesday' ] ,
[ 'Wed' , 'Wednesday' ] ,
[ 'Thu' , 'Thursday' ] ,
[ 'Fri' , 'Friday' ] ,
[ 'Sat' , 'Saturday' ]
] ;
var months /*:Array<Array<string> >*/ = [
[ 'J' , 'Jan' , 'January' ] ,
[ 'F' , 'Feb' , 'February' ] ,
[ 'M' , 'Mar' , 'March' ] ,
[ 'A' , 'Apr' , 'April' ] ,
[ 'M' , 'May' , 'May' ] ,
[ 'J' , 'Jun' , 'June' ] ,
[ 'J' , 'Jul' , 'July' ] ,
[ 'A' , 'Aug' , 'August' ] ,
[ 'S' , 'Sep' , 'September' ] ,
[ 'O' , 'Oct' , 'October' ] ,
[ 'N' , 'Nov' , 'November' ] ,
[ 'D' , 'Dec' , 'December' ]
] ;
function init _table ( t /*:any*/ ) {
t [ 0 ] = 'General' ;
t [ 1 ] = '0' ;
t [ 2 ] = '0.00' ;
t [ 3 ] = '#,##0' ;
t [ 4 ] = '#,##0.00' ;
t [ 9 ] = '0%' ;
t [ 10 ] = '0.00%' ;
t [ 11 ] = '0.00E+00' ;
t [ 12 ] = '# ?/?' ;
t [ 13 ] = '# ??/??' ;
t [ 14 ] = 'm/d/yy' ;
t [ 15 ] = 'd-mmm-yy' ;
t [ 16 ] = 'd-mmm' ;
t [ 17 ] = 'mmm-yy' ;
t [ 18 ] = 'h:mm AM/PM' ;
t [ 19 ] = 'h:mm:ss AM/PM' ;
t [ 20 ] = 'h:mm' ;
t [ 21 ] = 'h:mm:ss' ;
t [ 22 ] = 'm/d/yy h:mm' ;
t [ 37 ] = '#,##0 ;(#,##0)' ;
t [ 38 ] = '#,##0 ;[Red](#,##0)' ;
t [ 39 ] = '#,##0.00;(#,##0.00)' ;
t [ 40 ] = '#,##0.00;[Red](#,##0.00)' ;
t [ 45 ] = 'mm:ss' ;
t [ 46 ] = '[h]:mm:ss' ;
t [ 47 ] = 'mmss.0' ;
t [ 48 ] = '##0.0E+0' ;
t [ 49 ] = '@' ;
t [ 56 ] = '"上午/下午 "hh"時"mm"分"ss"秒 "' ;
}
var table _fmt = { } ;
init _table ( table _fmt ) ;
/* Defaults determined by systematically testing in Excel 2019 */
/* These formats appear to default to other formats in the table */
var default _map /*:Array<number>*/ = [ ] ;
var defi = 0 ;
// 5 -> 37 ... 8 -> 40
for ( defi = 5 ; defi <= 8 ; ++ defi ) default _map [ defi ] = 32 + defi ;
// 23 -> 0 ... 26 -> 0
for ( defi = 23 ; defi <= 26 ; ++ defi ) default _map [ defi ] = 0 ;
// 27 -> 14 ... 31 -> 14
for ( defi = 27 ; defi <= 31 ; ++ defi ) default _map [ defi ] = 14 ;
// 50 -> 14 ... 58 -> 14
for ( defi = 50 ; defi <= 58 ; ++ defi ) default _map [ defi ] = 14 ;
// 59 -> 1 ... 62 -> 4
for ( defi = 59 ; defi <= 62 ; ++ defi ) default _map [ defi ] = defi - 58 ;
// 67 -> 9 ... 68 -> 10
for ( defi = 67 ; defi <= 68 ; ++ defi ) default _map [ defi ] = defi - 58 ;
// 72 -> 14 ... 75 -> 17
for ( defi = 72 ; defi <= 75 ; ++ defi ) default _map [ defi ] = defi - 58 ;
// 69 -> 12 ... 71 -> 14
for ( defi = 67 ; defi <= 68 ; ++ defi ) default _map [ defi ] = defi - 57 ;
// 76 -> 20 ... 78 -> 22
for ( defi = 76 ; defi <= 78 ; ++ defi ) default _map [ defi ] = defi - 56 ;
// 79 -> 45 ... 81 -> 47
for ( defi = 79 ; defi <= 81 ; ++ defi ) default _map [ defi ] = defi - 34 ;
// 82 -> 0 ... 65536 -> 0 (omitted)
/* These formats technically refer to Accounting formats with no equivalent */
var default _str /*:Array<string>*/ = [ ] ;
// 5 -- Currency, 0 decimal, black negative
default _str [ 5 ] = default _str [ 63 ] = '"$"#,##0_);\\("$"#,##0\\)' ;
// 6 -- Currency, 0 decimal, red negative
default _str [ 6 ] = default _str [ 64 ] = '"$"#,##0_);[Red]\\("$"#,##0\\)' ;
// 7 -- Currency, 2 decimal, black negative
default _str [ 7 ] = default _str [ 65 ] = '"$"#,##0.00_);\\("$"#,##0.00\\)' ;
// 8 -- Currency, 2 decimal, red negative
default _str [ 8 ] = default _str [ 66 ] = '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' ;
// 41 -- Accounting, 0 decimal, No Symbol
default _str [ 41 ] = '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)' ;
// 42 -- Accounting, 0 decimal, $ Symbol
default _str [ 42 ] = '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)' ;
// 43 -- Accounting, 2 decimal, No Symbol
default _str [ 43 ] = '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)' ;
// 44 -- Accounting, 2 decimal, $ Symbol
default _str [ 44 ] = '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)' ;
function frac ( x /*:number*/ , D /*:number*/ , mixed /*:?boolean*/ ) /*:Array<number>*/ {
var sgn = x < 0 ? - 1 : 1 ;
var B = x * sgn ;
var P _2 = 0 , P _1 = 1 , P = 0 ;
var Q _2 = 1 , Q _1 = 0 , Q = 0 ;
var A = Math . floor ( B ) ;
while ( Q _1 < D ) {
A = Math . floor ( B ) ;
P = A * P _1 + P _2 ;
Q = A * Q _1 + Q _2 ;
if ( ( B - A ) < 0.00000005 ) break ;
B = 1 / ( B - A ) ;
P _2 = P _1 ; P _1 = P ;
Q _2 = Q _1 ; Q _1 = Q ;
}
if ( Q > D ) { if ( Q _1 > D ) { Q = Q _2 ; P = P _2 ; } else { Q = Q _1 ; P = P _1 ; } }
if ( ! mixed ) return [ 0 , sgn * P , Q ] ;
var q = Math . floor ( sgn * P / Q ) ;
return [ q , sgn * P - q * Q , Q ] ;
}
function parse _date _code ( v /*:number*/ , opts /*:?any*/ , b2 /*:?boolean*/ ) {
if ( v > 2958465 || v < 0 ) return null ;
var date = ( v | 0 ) , time = Math . floor ( 86400 * ( v - date ) ) , dow = 0 ;
var dout = [ ] ;
var out = { D : date , T : time , u : 86400 * ( v - date ) - time , y : 0 , m : 0 , d : 0 , H : 0 , M : 0 , S : 0 , q : 0 } ;
if ( Math . abs ( out . u ) < 1e-6 ) out . u = 0 ;
if ( opts && opts . date1904 ) date += 1462 ;
if ( out . u > 0.9999 ) {
out . u = 0 ;
if ( ++ time == 86400 ) { out . T = time = 0 ; ++ date ; ++ out . D ; }
}
if ( date === 60 ) { dout = b2 ? [ 1317 , 10 , 29 ] : [ 1900 , 2 , 29 ] ; dow = 3 ; }
else if ( date === 0 ) { dout = b2 ? [ 1317 , 8 , 29 ] : [ 1900 , 1 , 0 ] ; dow = 6 ; }
else {
if ( date > 60 ) -- date ;
/* 1 = Jan 1 1900 in Gregorian */
var d = new Date ( 1900 , 0 , 1 ) ;
d . setDate ( d . getDate ( ) + date - 1 ) ;
dout = [ d . getFullYear ( ) , d . getMonth ( ) + 1 , d . getDate ( ) ] ;
dow = d . getDay ( ) ;
if ( date < 60 ) dow = ( dow + 6 ) % 7 ;
if ( b2 ) dow = fix _hijri ( d , dout ) ;
}
out . y = dout [ 0 ] ; out . m = dout [ 1 ] ; out . d = dout [ 2 ] ;
out . S = time % 60 ; time = Math . floor ( time / 60 ) ;
out . M = time % 60 ; time = Math . floor ( time / 60 ) ;
out . H = time ;
out . q = dow ;
return out ;
}
SSF . parse _date _code = parse _date _code ;
var basedate = new Date ( 1899 , 11 , 31 , 0 , 0 , 0 ) ;
var dnthresh = basedate . getTime ( ) ;
var base1904 = new Date ( 1900 , 2 , 1 , 0 , 0 , 0 ) ;
function datenum _local ( v /*:Date*/ , date1904 /*:?boolean*/ ) /*:number*/ {
var epoch = v . getTime ( ) ;
if ( date1904 ) epoch -= 1461 * 24 * 60 * 60 * 1000 ;
else if ( v >= base1904 ) epoch += 24 * 60 * 60 * 1000 ;
return ( epoch - ( dnthresh + ( v . getTimezoneOffset ( ) - basedate . getTimezoneOffset ( ) ) * 60000 ) ) / ( 24 * 60 * 60 * 1000 ) ;
}
/* The longest 32-bit integer text is "-4294967296", exactly 11 chars */
function general _fmt _int ( v /*:number*/ ) /*:string*/ { return v . toString ( 10 ) ; }
SSF . _general _int = general _fmt _int ;
/* ECMA-376 18.8.30 numFmt*/
/* Note: `toPrecision` uses standard form when prec > E and E >= -6 */
var general _fmt _num = ( function make _general _fmt _num ( ) {
var trailing _zeroes _and _decimal = /(?:\.0*|(\.\d*[1-9])0+)$/ ;
function strip _decimal ( o /*:string*/ ) /*:string*/ {
return ( o . indexOf ( "." ) == - 1 ) ? o : o . replace ( trailing _zeroes _and _decimal , "$1" ) ;
}
/* General Exponential always shows 2 digits exp and trims the mantissa */
var mantissa _zeroes _and _decimal = /(?:\.0*|(\.\d*[1-9])0+)[Ee]/ ;
var exp _with _single _digit = /(E[+-])(\d)$/ ;
function normalize _exp ( o /*:string*/ ) /*:string*/ {
if ( o . indexOf ( "E" ) == - 1 ) return o ;
return o . replace ( mantissa _zeroes _and _decimal , "$1E" ) . replace ( exp _with _single _digit , "$10$2" ) ;
}
/* exponent >= -9 and <= 9 */
function small _exp ( v /*:number*/ ) /*:string*/ {
var w = ( v < 0 ? 12 : 11 ) ;
var o = strip _decimal ( v . toFixed ( 12 ) ) ; if ( o . length <= w ) return o ;
o = v . toPrecision ( 10 ) ; if ( o . length <= w ) return o ;
return v . toExponential ( 5 ) ;
}
/* exponent >= 11 or <= -10 likely exponential */
function large _exp ( v /*:number*/ ) /*:string*/ {
var o = strip _decimal ( v . toFixed ( 11 ) ) ;
return ( o . length > ( v < 0 ? 12 : 11 ) || o === "0" || o === "-0" ) ? v . toPrecision ( 6 ) : o ;
}
function general _fmt _num _base ( v /*:number*/ ) /*:string*/ {
var V = Math . floor ( Math . log ( Math . abs ( v ) ) * Math . LOG10E ) , o ;
if ( V >= - 4 && V <= - 1 ) o = v . toPrecision ( 10 + V ) ;
else if ( Math . abs ( V ) <= 9 ) o = small _exp ( v ) ;
else if ( V === 10 ) o = v . toFixed ( 10 ) . substr ( 0 , 12 ) ;
else o = large _exp ( v ) ;
return strip _decimal ( normalize _exp ( o . toUpperCase ( ) ) ) ;
}
return general _fmt _num _base ;
} ) ( ) ;
SSF . _general _num = general _fmt _num ;
/ *
"General" rules :
- text is passed through ( "@" )
- booleans are rendered as TRUE / FALSE
- "up to 11 characters" displayed for numbers
- Default date format ( code 14 ) used for Dates
TODO : technically the display depends on the width of the cell
* /
function general _fmt ( v /*:any*/ , opts /*:any*/ ) {
switch ( typeof v ) {
case 'string' : return v ;
case 'boolean' : return v ? "TRUE" : "FALSE" ;
case 'number' : return ( v | 0 ) === v ? v . toString ( 10 ) : general _fmt _num ( v ) ;
case 'undefined' : return "" ;
case 'object' :
if ( v == null ) return "" ;
if ( v instanceof Date ) return format ( 14 , datenum _local ( v , opts && opts . date1904 ) , opts ) ;
}
throw new Error ( "unsupported value in General format: " + v ) ;
}
SSF . _general = general _fmt ;
function fix _hijri ( date /*:Date*/ , o /*:[number, number, number]*/ ) {
/* TODO: properly adjust y/m/d and */
o [ 0 ] -= 581 ;
var dow = date . getDay ( ) ;
if ( date < 60 ) dow = ( dow + 6 ) % 7 ;
return dow ;
}
//var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split("");
/*jshint -W086 */
function write _date ( type /*:number*/ , fmt /*:string*/ , val , ss0 /*:?number*/ ) /*:string*/ {
var o = "" , ss = 0 , tt = 0 , y = val . y , out , outl = 0 ;
switch ( type ) {
case 98 : /* 'b' buddhist year */
y = val . y + 543 ;
/* falls through */
case 121 : /* 'y' year */
switch ( fmt . length ) {
case 1 : case 2 : out = y % 100 ; outl = 2 ; break ;
default : out = y % 10000 ; outl = 4 ; break ;
} break ;
case 109 : /* 'm' month */
switch ( fmt . length ) {
case 1 : case 2 : out = val . m ; outl = fmt . length ; break ;
case 3 : return months [ val . m - 1 ] [ 1 ] ;
case 5 : return months [ val . m - 1 ] [ 0 ] ;
default : return months [ val . m - 1 ] [ 2 ] ;
} break ;
case 100 : /* 'd' day */
switch ( fmt . length ) {
case 1 : case 2 : out = val . d ; outl = fmt . length ; break ;
case 3 : return days [ val . q ] [ 0 ] ;
default : return days [ val . q ] [ 1 ] ;
} break ;
case 104 : /* 'h' 12-hour */
switch ( fmt . length ) {
case 1 : case 2 : out = 1 + ( val . H + 11 ) % 12 ; outl = fmt . length ; break ;
default : throw 'bad hour format: ' + fmt ;
} break ;
case 72 : /* 'H' 24-hour */
switch ( fmt . length ) {
case 1 : case 2 : out = val . H ; outl = fmt . length ; break ;
default : throw 'bad hour format: ' + fmt ;
} break ;
case 77 : /* 'M' minutes */
switch ( fmt . length ) {
case 1 : case 2 : out = val . M ; outl = fmt . length ; break ;
default : throw 'bad minute format: ' + fmt ;
} break ;
case 115 : /* 's' seconds */
if ( fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000' ) throw 'bad second format: ' + fmt ;
if ( val . u === 0 && ( fmt == "s" || fmt == "ss" ) ) return pad0 ( val . S , fmt . length ) ;
/*::if(!ss0) ss0 = 0; */
if ( ss0 >= 2 ) tt = ss0 === 3 ? 1000 : 100 ;
else tt = ss0 === 1 ? 10 : 1 ;
ss = Math . round ( ( tt ) * ( val . S + val . u ) ) ;
if ( ss >= 60 * tt ) ss = 0 ;
if ( fmt === 's' ) return ss === 0 ? "0" : "" + ss / tt ;
o = pad0 ( ss , 2 + ss0 ) ;
if ( fmt === 'ss' ) return o . substr ( 0 , 2 ) ;
return "." + o . substr ( 2 , fmt . length - 1 ) ;
case 90 : /* 'Z' absolute time */
switch ( fmt ) {
case '[h]' : case '[hh]' : out = val . D * 24 + val . H ; break ;
case '[m]' : case '[mm]' : out = ( val . D * 24 + val . H ) * 60 + val . M ; break ;
case '[s]' : case '[ss]' : out = ( ( val . D * 24 + val . H ) * 60 + val . M ) * 60 + Math . round ( val . S + val . u ) ; break ;
default : throw 'bad abstime format: ' + fmt ;
} outl = fmt . length === 3 ? 1 : 2 ; break ;
case 101 : /* 'e' era */
out = y ; outl = 1 ; break ;
}
var outstr = outl > 0 ? pad0 ( out , outl ) : "" ;
return outstr ;
}
/*jshint +W086 */
function commaify ( s /*:string*/ ) /*:string*/ {
var w = 3 ;
if ( s . length <= w ) return s ;
var j = ( s . length % w ) , o = s . substr ( 0 , j ) ;
for ( ; j != s . length ; j += w ) o += ( o . length > 0 ? "," : "" ) + s . substr ( j , w ) ;
return o ;
}
var write _num /*:SSF_write_num*/ = ( function make _write _num ( ) {
var pct1 = /%/g ;
function write _num _pct ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
var sfmt = fmt . replace ( pct1 , "" ) , mul = fmt . length - sfmt . length ;
return write _num ( type , sfmt , val * Math . pow ( 10 , 2 * mul ) ) + fill ( "%" , mul ) ;
}
function write _num _cm ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
var idx = fmt . length - 1 ;
while ( fmt . charCodeAt ( idx - 1 ) === 44 ) -- idx ;
return write _num ( type , fmt . substr ( 0 , idx ) , val / Math . pow ( 10 , 3 * ( fmt . length - idx ) ) ) ;
}
function write _num _exp ( fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
var o /*:string*/ ;
var idx = fmt . indexOf ( "E" ) - fmt . indexOf ( "." ) - 1 ;
if ( fmt . match ( /^#+0.0E\+0$/ ) ) {
if ( val == 0 ) return "0.0E+0" ;
else if ( val < 0 ) return "-" + write _num _exp ( fmt , - val ) ;
var period = fmt . indexOf ( "." ) ; if ( period === - 1 ) period = fmt . indexOf ( 'E' ) ;
var ee = Math . floor ( Math . log ( val ) * Math . LOG10E ) % period ;
if ( ee < 0 ) ee += period ;
o = ( val / Math . pow ( 10 , ee ) ) . toPrecision ( idx + 1 + ( period + ee ) % period ) ;
if ( o . indexOf ( "e" ) === - 1 ) {
var fakee = Math . floor ( Math . log ( val ) * Math . LOG10E ) ;
if ( o . indexOf ( "." ) === - 1 ) o = o . charAt ( 0 ) + "." + o . substr ( 1 ) + "E+" + ( fakee - o . length + ee ) ;
else o += "E+" + ( fakee - ee ) ;
while ( o . substr ( 0 , 2 ) === "0." ) {
o = o . charAt ( 0 ) + o . substr ( 2 , period ) + "." + o . substr ( 2 + period ) ;
o = o . replace ( /^0+([1-9])/ , "$1" ) . replace ( /^0+\./ , "0." ) ;
}
o = o . replace ( /\+-/ , "-" ) ;
}
o = o . replace ( /^([+-]?)(\d*)\.(\d*)[Ee]/ , function ( $$ , $1 , $2 , $3 ) { return $1 + $2 + $3 . substr ( 0 , ( period + ee ) % period ) + "." + $3 . substr ( ee ) + "E" ; } ) ;
} else o = val . toExponential ( idx ) ;
if ( fmt . match ( /E\+00$/ ) && o . match ( /e[+-]\d$/ ) ) o = o . substr ( 0 , o . length - 1 ) + "0" + o . charAt ( o . length - 1 ) ;
if ( fmt . match ( /E\-/ ) && o . match ( /e\+/ ) ) o = o . replace ( /e\+/ , "e" ) ;
return o . replace ( "e" , "E" ) ;
}
var frac1 = /# (\?+)( ?)\/( ?)(\d+)/ ;
function write _num _f1 ( r /*:Array<string>*/ , aval /*:number*/ , sign /*:string*/ ) /*:string*/ {
var den = parseInt ( r [ 4 ] , 10 ) , rr = Math . round ( aval * den ) , base = Math . floor ( rr / den ) ;
var myn = ( rr - base * den ) , myd = den ;
return sign + ( base === 0 ? "" : "" + base ) + " " + ( myn === 0 ? fill ( " " , r [ 1 ] . length + 1 + r [ 4 ] . length ) : pad _ ( myn , r [ 1 ] . length ) + r [ 2 ] + "/" + r [ 3 ] + pad0 ( myd , r [ 4 ] . length ) ) ;
}
function write _num _f2 ( r /*:Array<string>*/ , aval /*:number*/ , sign /*:string*/ ) /*:string*/ {
return sign + ( aval === 0 ? "" : "" + aval ) + fill ( " " , r [ 1 ] . length + 2 + r [ 4 ] . length ) ;
}
var dec1 = /^#*0*\.([0#]+)/ ;
var closeparen = /\).*[0#]/ ;
var phone = /\(###\) ###\\?-####/ ;
function hashq ( str /*:string*/ ) /*:string*/ {
var o = "" , cc ;
for ( var i = 0 ; i != str . length ; ++ i ) switch ( ( cc = str . charCodeAt ( i ) ) ) {
case 35 : break ;
case 63 : o += " " ; break ;
case 48 : o += "0" ; break ;
default : o += String . fromCharCode ( cc ) ;
}
return o ;
}
function rnd ( val /*:number*/ , d /*:number*/ ) /*:string*/ { var dd = Math . pow ( 10 , d ) ; return "" + ( Math . round ( val * dd ) / dd ) ; }
function dec ( val /*:number*/ , d /*:number*/ ) /*:number*/ {
var _frac = val - Math . floor ( val ) , dd = Math . pow ( 10 , d ) ;
if ( d < ( '' + Math . round ( _frac * dd ) ) . length ) return 0 ;
return Math . round ( _frac * dd ) ;
}
function carry ( val /*:number*/ , d /*:number*/ ) /*:number*/ {
if ( d < ( '' + Math . round ( ( val - Math . floor ( val ) ) * Math . pow ( 10 , d ) ) ) . length ) {
return 1 ;
}
return 0 ;
}
function flr ( val /*:number*/ ) /*:string*/ {
if ( val < 2147483647 && val > - 2147483648 ) return "" + ( val >= 0 ? ( val | 0 ) : ( val - 1 | 0 ) ) ;
return "" + Math . floor ( val ) ;
}
function write _num _flt ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
if ( type . charCodeAt ( 0 ) === 40 && ! fmt . match ( closeparen ) ) {
var ffmt = fmt . replace ( /\( */ , "" ) . replace ( / \)/ , "" ) . replace ( /\)/ , "" ) ;
if ( val >= 0 ) return write _num _flt ( 'n' , ffmt , val ) ;
return '(' + write _num _flt ( 'n' , ffmt , - val ) + ')' ;
}
if ( fmt . charCodeAt ( fmt . length - 1 ) === 44 ) return write _num _cm ( type , fmt , val ) ;
if ( fmt . indexOf ( '%' ) !== - 1 ) return write _num _pct ( type , fmt , val ) ;
if ( fmt . indexOf ( 'E' ) !== - 1 ) return write _num _exp ( fmt , val ) ;
if ( fmt . charCodeAt ( 0 ) === 36 ) return "$" + write _num _flt ( type , fmt . substr ( fmt . charAt ( 1 ) == ' ' ? 2 : 1 ) , val ) ;
var o ;
var r /*:?Array<string>*/ , ri , ff , aval = Math . abs ( val ) , sign = val < 0 ? "-" : "" ;
if ( fmt . match ( /^00+$/ ) ) return sign + pad0r ( aval , fmt . length ) ;
if ( fmt . match ( /^[#?]+$/ ) ) {
o = pad0r ( val , 0 ) ; if ( o === "0" ) o = "" ;
return o . length > fmt . length ? o : hashq ( fmt . substr ( 0 , fmt . length - o . length ) ) + o ;
}
if ( ( r = fmt . match ( frac1 ) ) ) return write _num _f1 ( r , aval , sign ) ;
if ( fmt . match ( /^#+0+$/ ) ) return sign + pad0r ( aval , fmt . length - fmt . indexOf ( "0" ) ) ;
if ( ( r = fmt . match ( dec1 ) ) ) {
o = rnd ( val , r [ 1 ] . length ) . replace ( /^([^\.]+)$/ , "$1." + hashq ( r [ 1 ] ) ) . replace ( /\.$/ , "." + hashq ( r [ 1 ] ) ) . replace ( /\.(\d*)$/ , function ( $$ , $1 ) { return "." + $1 + fill ( "0" , hashq ( /*::(*/ r /*::||[""])*/ [ 1 ] ) . length - $1 . length ) ; } ) ;
return fmt . indexOf ( "0." ) !== - 1 ? o : o . replace ( /^0\./ , "." ) ;
}
fmt = fmt . replace ( /^#+([0.])/ , "$1" ) ;
if ( ( r = fmt . match ( /^(0*)\.(#*)$/ ) ) ) {
return sign + rnd ( aval , r [ 2 ] . length ) . replace ( /\.(\d*[1-9])0*$/ , ".$1" ) . replace ( /^(-?\d*)$/ , "$1." ) . replace ( /^0\./ , r [ 1 ] . length ? "0." : "." ) ;
}
if ( ( r = fmt . match ( /^#{1,3},##0(\.?)$/ ) ) ) return sign + commaify ( pad0r ( aval , 0 ) ) ;
if ( ( r = fmt . match ( /^#,##0\.([#0]*0)$/ ) ) ) {
return val < 0 ? "-" + write _num _flt ( type , fmt , - val ) : commaify ( "" + ( Math . floor ( val ) + carry ( val , r [ 1 ] . length ) ) ) + "." + pad0 ( dec ( val , r [ 1 ] . length ) , r [ 1 ] . length ) ;
}
if ( ( r = fmt . match ( /^#,#*,#0/ ) ) ) return write _num _flt ( type , fmt . replace ( /^#,#*,/ , "" ) , val ) ;
if ( ( r = fmt . match ( /^([0#]+)(\\?-([0#]+))+$/ ) ) ) {
o = _strrev ( write _num _flt ( type , fmt . replace ( /[\\-]/g , "" ) , val ) ) ;
ri = 0 ;
return _strrev ( _strrev ( fmt . replace ( /\\/g , "" ) ) . replace ( /[0#]/g , function ( x ) { return ri < o . length ? o . charAt ( ri ++ ) : x === '0' ? '0' : "" ; } ) ) ;
}
if ( fmt . match ( phone ) ) {
o = write _num _flt ( type , "##########" , val ) ;
return "(" + o . substr ( 0 , 3 ) + ") " + o . substr ( 3 , 3 ) + "-" + o . substr ( 6 ) ;
}
var oa = "" ;
if ( ( r = fmt . match ( /^([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
ri = Math . min ( /*::String(*/ r [ 4 ] /*::)*/ . length , 7 ) ;
ff = frac ( aval , Math . pow ( 10 , ri ) - 1 , false ) ;
o = "" + sign ;
oa = write _num ( "n" , /*::String(*/ r [ 1 ] /*::)*/ , ff [ 1 ] ) ;
if ( oa . charAt ( oa . length - 1 ) == " " ) oa = oa . substr ( 0 , oa . length - 1 ) + "0" ;
o += oa + /*::String(*/ r [ 2 ] /*::)*/ + "/" + /*::String(*/ r [ 3 ] /*::)*/ ;
oa = rpad _ ( ff [ 2 ] , ri ) ;
if ( oa . length < r [ 4 ] . length ) oa = hashq ( r [ 4 ] . substr ( r [ 4 ] . length - oa . length ) ) + oa ;
o += oa ;
return o ;
}
if ( ( r = fmt . match ( /^# ([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
ri = Math . min ( Math . max ( r [ 1 ] . length , r [ 4 ] . length ) , 7 ) ;
ff = frac ( aval , Math . pow ( 10 , ri ) - 1 , true ) ;
return sign + ( ff [ 0 ] || ( ff [ 1 ] ? "" : "0" ) ) + " " + ( ff [ 1 ] ? pad _ ( ff [ 1 ] , ri ) + r [ 2 ] + "/" + r [ 3 ] + rpad _ ( ff [ 2 ] , ri ) : fill ( " " , 2 * ri + 1 + r [ 2 ] . length + r [ 3 ] . length ) ) ;
}
if ( ( r = fmt . match ( /^[#0?]+$/ ) ) ) {
o = pad0r ( val , 0 ) ;
if ( fmt . length <= o . length ) return o ;
return hashq ( fmt . substr ( 0 , fmt . length - o . length ) ) + o ;
}
if ( ( r = fmt . match ( /^([#0?]+)\.([#0]+)$/ ) ) ) {
o = "" + val . toFixed ( Math . min ( r [ 2 ] . length , 10 ) ) . replace ( /([^0])0+$/ , "$1" ) ;
ri = o . indexOf ( "." ) ;
var lres = fmt . indexOf ( "." ) - ri , rres = fmt . length - o . length - lres ;
return hashq ( fmt . substr ( 0 , lres ) + o + fmt . substr ( fmt . length - rres ) ) ;
}
if ( ( r = fmt . match ( /^00,000\.([#0]*0)$/ ) ) ) {
ri = dec ( val , r [ 1 ] . length ) ;
return val < 0 ? "-" + write _num _flt ( type , fmt , - val ) : commaify ( flr ( val ) ) . replace ( /^\d,\d{3}$/ , "0$&" ) . replace ( /^\d*$/ , function ( $$ ) { return "00," + ( $$ . length < 3 ? pad0 ( 0 , 3 - $$ . length ) : "" ) + $$ ; } ) + "." + pad0 ( ri , r [ 1 ] . length ) ;
}
switch ( fmt ) {
case "###,##0.00" : return write _num _flt ( type , "#,##0.00" , val ) ;
case "###,###" :
case "##,###" :
case "#,###" : var x = commaify ( pad0r ( aval , 0 ) ) ; return x !== "0" ? sign + x : "" ;
case "###,###.00" : return write _num _flt ( type , "###,##0.00" , val ) . replace ( /^0\./ , "." ) ;
case "#,###.00" : return write _num _flt ( type , "#,##0.00" , val ) . replace ( /^0\./ , "." ) ;
default :
}
throw new Error ( "unsupported format |" + fmt + "|" ) ;
}
function write _num _cm2 ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
var idx = fmt . length - 1 ;
while ( fmt . charCodeAt ( idx - 1 ) === 44 ) -- idx ;
return write _num ( type , fmt . substr ( 0 , idx ) , val / Math . pow ( 10 , 3 * ( fmt . length - idx ) ) ) ;
}
function write _num _pct2 ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
var sfmt = fmt . replace ( pct1 , "" ) , mul = fmt . length - sfmt . length ;
return write _num ( type , sfmt , val * Math . pow ( 10 , 2 * mul ) ) + fill ( "%" , mul ) ;
}
function write _num _exp2 ( fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
var o /*:string*/ ;
var idx = fmt . indexOf ( "E" ) - fmt . indexOf ( "." ) - 1 ;
if ( fmt . match ( /^#+0.0E\+0$/ ) ) {
if ( val == 0 ) return "0.0E+0" ;
else if ( val < 0 ) return "-" + write _num _exp2 ( fmt , - val ) ;
var period = fmt . indexOf ( "." ) ; if ( period === - 1 ) period = fmt . indexOf ( 'E' ) ;
var ee = Math . floor ( Math . log ( val ) * Math . LOG10E ) % period ;
if ( ee < 0 ) ee += period ;
o = ( val / Math . pow ( 10 , ee ) ) . toPrecision ( idx + 1 + ( period + ee ) % period ) ;
if ( ! o . match ( /[Ee]/ ) ) {
var fakee = Math . floor ( Math . log ( val ) * Math . LOG10E ) ;
if ( o . indexOf ( "." ) === - 1 ) o = o . charAt ( 0 ) + "." + o . substr ( 1 ) + "E+" + ( fakee - o . length + ee ) ;
else o += "E+" + ( fakee - ee ) ;
o = o . replace ( /\+-/ , "-" ) ;
}
o = o . replace ( /^([+-]?)(\d*)\.(\d*)[Ee]/ , function ( $$ , $1 , $2 , $3 ) { return $1 + $2 + $3 . substr ( 0 , ( period + ee ) % period ) + "." + $3 . substr ( ee ) + "E" ; } ) ;
} else o = val . toExponential ( idx ) ;
if ( fmt . match ( /E\+00$/ ) && o . match ( /e[+-]\d$/ ) ) o = o . substr ( 0 , o . length - 1 ) + "0" + o . charAt ( o . length - 1 ) ;
if ( fmt . match ( /E\-/ ) && o . match ( /e\+/ ) ) o = o . replace ( /e\+/ , "e" ) ;
return o . replace ( "e" , "E" ) ;
}
function write _num _int ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
if ( type . charCodeAt ( 0 ) === 40 && ! fmt . match ( closeparen ) ) {
var ffmt = fmt . replace ( /\( */ , "" ) . replace ( / \)/ , "" ) . replace ( /\)/ , "" ) ;
if ( val >= 0 ) return write _num _int ( 'n' , ffmt , val ) ;
return '(' + write _num _int ( 'n' , ffmt , - val ) + ')' ;
}
if ( fmt . charCodeAt ( fmt . length - 1 ) === 44 ) return write _num _cm2 ( type , fmt , val ) ;
if ( fmt . indexOf ( '%' ) !== - 1 ) return write _num _pct2 ( type , fmt , val ) ;
if ( fmt . indexOf ( 'E' ) !== - 1 ) return write _num _exp2 ( fmt , val ) ;
if ( fmt . charCodeAt ( 0 ) === 36 ) return "$" + write _num _int ( type , fmt . substr ( fmt . charAt ( 1 ) == ' ' ? 2 : 1 ) , val ) ;
var o ;
var r /*:?Array<string>*/ , ri , ff , aval = Math . abs ( val ) , sign = val < 0 ? "-" : "" ;
if ( fmt . match ( /^00+$/ ) ) return sign + pad0 ( aval , fmt . length ) ;
if ( fmt . match ( /^[#?]+$/ ) ) {
o = ( "" + val ) ; if ( val === 0 ) o = "" ;
return o . length > fmt . length ? o : hashq ( fmt . substr ( 0 , fmt . length - o . length ) ) + o ;
}
if ( ( r = fmt . match ( frac1 ) ) ) return write _num _f2 ( r , aval , sign ) ;
if ( fmt . match ( /^#+0+$/ ) ) return sign + pad0 ( aval , fmt . length - fmt . indexOf ( "0" ) ) ;
if ( ( r = fmt . match ( dec1 ) ) ) {
/*:: if(!Array.isArray(r)) throw new Error("unreachable"); */
o = ( "" + val ) . replace ( /^([^\.]+)$/ , "$1." + hashq ( r [ 1 ] ) ) . replace ( /\.$/ , "." + hashq ( r [ 1 ] ) ) ;
o = o . replace ( /\.(\d*)$/ , function ( $$ , $1 ) {
/*:: if(!Array.isArray(r)) throw new Error("unreachable"); */
return "." + $1 + fill ( "0" , hashq ( r [ 1 ] ) . length - $1 . length ) ; } ) ;
return fmt . indexOf ( "0." ) !== - 1 ? o : o . replace ( /^0\./ , "." ) ;
}
fmt = fmt . replace ( /^#+([0.])/ , "$1" ) ;
if ( ( r = fmt . match ( /^(0*)\.(#*)$/ ) ) ) {
return sign + ( "" + aval ) . replace ( /\.(\d*[1-9])0*$/ , ".$1" ) . replace ( /^(-?\d*)$/ , "$1." ) . replace ( /^0\./ , r [ 1 ] . length ? "0." : "." ) ;
}
if ( ( r = fmt . match ( /^#{1,3},##0(\.?)$/ ) ) ) return sign + commaify ( ( "" + aval ) ) ;
if ( ( r = fmt . match ( /^#,##0\.([#0]*0)$/ ) ) ) {
return val < 0 ? "-" + write _num _int ( type , fmt , - val ) : commaify ( ( "" + val ) ) + "." + fill ( '0' , r [ 1 ] . length ) ;
}
if ( ( r = fmt . match ( /^#,#*,#0/ ) ) ) return write _num _int ( type , fmt . replace ( /^#,#*,/ , "" ) , val ) ;
if ( ( r = fmt . match ( /^([0#]+)(\\?-([0#]+))+$/ ) ) ) {
o = _strrev ( write _num _int ( type , fmt . replace ( /[\\-]/g , "" ) , val ) ) ;
ri = 0 ;
return _strrev ( _strrev ( fmt . replace ( /\\/g , "" ) ) . replace ( /[0#]/g , function ( x ) { return ri < o . length ? o . charAt ( ri ++ ) : x === '0' ? '0' : "" ; } ) ) ;
}
if ( fmt . match ( phone ) ) {
o = write _num _int ( type , "##########" , val ) ;
return "(" + o . substr ( 0 , 3 ) + ") " + o . substr ( 3 , 3 ) + "-" + o . substr ( 6 ) ;
}
var oa = "" ;
if ( ( r = fmt . match ( /^([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
ri = Math . min ( /*::String(*/ r [ 4 ] /*::)*/ . length , 7 ) ;
ff = frac ( aval , Math . pow ( 10 , ri ) - 1 , false ) ;
o = "" + sign ;
oa = write _num ( "n" , /*::String(*/ r [ 1 ] /*::)*/ , ff [ 1 ] ) ;
if ( oa . charAt ( oa . length - 1 ) == " " ) oa = oa . substr ( 0 , oa . length - 1 ) + "0" ;
o += oa + /*::String(*/ r [ 2 ] /*::)*/ + "/" + /*::String(*/ r [ 3 ] /*::)*/ ;
oa = rpad _ ( ff [ 2 ] , ri ) ;
if ( oa . length < r [ 4 ] . length ) oa = hashq ( r [ 4 ] . substr ( r [ 4 ] . length - oa . length ) ) + oa ;
o += oa ;
return o ;
}
if ( ( r = fmt . match ( /^# ([#0?]+)( ?)\/( ?)([#0?]+)/ ) ) ) {
ri = Math . min ( Math . max ( r [ 1 ] . length , r [ 4 ] . length ) , 7 ) ;
ff = frac ( aval , Math . pow ( 10 , ri ) - 1 , true ) ;
return sign + ( ff [ 0 ] || ( ff [ 1 ] ? "" : "0" ) ) + " " + ( ff [ 1 ] ? pad _ ( ff [ 1 ] , ri ) + r [ 2 ] + "/" + r [ 3 ] + rpad _ ( ff [ 2 ] , ri ) : fill ( " " , 2 * ri + 1 + r [ 2 ] . length + r [ 3 ] . length ) ) ;
}
if ( ( r = fmt . match ( /^[#0?]+$/ ) ) ) {
o = "" + val ;
if ( fmt . length <= o . length ) return o ;
return hashq ( fmt . substr ( 0 , fmt . length - o . length ) ) + o ;
}
if ( ( r = fmt . match ( /^([#0]+)\.([#0]+)$/ ) ) ) {
o = "" + val . toFixed ( Math . min ( r [ 2 ] . length , 10 ) ) . replace ( /([^0])0+$/ , "$1" ) ;
ri = o . indexOf ( "." ) ;
var lres = fmt . indexOf ( "." ) - ri , rres = fmt . length - o . length - lres ;
return hashq ( fmt . substr ( 0 , lres ) + o + fmt . substr ( fmt . length - rres ) ) ;
}
if ( ( r = fmt . match ( /^00,000\.([#0]*0)$/ ) ) ) {
return val < 0 ? "-" + write _num _int ( type , fmt , - val ) : commaify ( "" + val ) . replace ( /^\d,\d{3}$/ , "0$&" ) . replace ( /^\d*$/ , function ( $$ ) { return "00," + ( $$ . length < 3 ? pad0 ( 0 , 3 - $$ . length ) : "" ) + $$ ; } ) + "." + pad0 ( 0 , r [ 1 ] . length ) ;
}
switch ( fmt ) {
case "###,###" :
case "##,###" :
case "#,###" : var x = commaify ( "" + aval ) ; return x !== "0" ? sign + x : "" ;
default :
if ( fmt . match ( /\.[0#?]*$/ ) ) return write _num _int ( type , fmt . slice ( 0 , fmt . lastIndexOf ( "." ) ) , val ) + hashq ( fmt . slice ( fmt . lastIndexOf ( "." ) ) ) ;
}
throw new Error ( "unsupported format |" + fmt + "|" ) ;
}
return function write _num ( type /*:string*/ , fmt /*:string*/ , val /*:number*/ ) /*:string*/ {
return ( val | 0 ) === val ? write _num _int ( type , fmt , val ) : write _num _flt ( type , fmt , val ) ;
} ; } ) ( ) ;
function split _fmt ( fmt /*:string*/ ) /*:Array<string>*/ {
var out /*:Array<string>*/ = [ ] ;
var in _str = false /*, cc*/ ;
for ( var i = 0 , j = 0 ; i < fmt . length ; ++ i ) switch ( ( /*cc=*/ fmt . charCodeAt ( i ) ) ) {
case 34 : /* '"' */
in _str = ! in _str ; break ;
case 95 : case 42 : case 92 : /* '_' '*' '\\' */
++ i ; break ;
case 59 : /* ';' */
out [ out . length ] = fmt . substr ( j , i - j ) ;
j = i + 1 ;
}
out [ out . length ] = fmt . substr ( j ) ;
if ( in _str === true ) throw new Error ( "Format |" + fmt + "| unterminated string " ) ;
return out ;
}
SSF . _split = split _fmt ;
var abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/ ;
function fmt _is _date ( fmt /*:string*/ ) /*:boolean*/ {
var i = 0 , /*cc = 0,*/ c = "" , o = "" ;
while ( i < fmt . length ) {
switch ( ( c = fmt . charAt ( i ) ) ) {
case 'G' : if ( isgeneral ( fmt , i ) ) i += 6 ; i ++ ; break ;
case '"' : for ( ; ( /*cc=*/ fmt . charCodeAt ( ++ i ) ) !== 34 && i < fmt . length ; ) { /*empty*/ } ++ i ; break ;
case '\\' : i += 2 ; break ;
case '_' : i += 2 ; break ;
case '@' : ++ i ; break ;
case 'B' : case 'b' :
if ( fmt . charAt ( i + 1 ) === "1" || fmt . charAt ( i + 1 ) === "2" ) return true ;
/* falls through */
case 'M' : case 'D' : case 'Y' : case 'H' : case 'S' : case 'E' :
/* falls through */
case 'm' : case 'd' : case 'y' : case 'h' : case 's' : case 'e' : case 'g' : return true ;
case 'A' : case 'a' : case '上' :
if ( fmt . substr ( i , 3 ) . toUpperCase ( ) === "A/P" ) return true ;
if ( fmt . substr ( i , 5 ) . toUpperCase ( ) === "AM/PM" ) return true ;
if ( fmt . substr ( i , 5 ) . toUpperCase ( ) === "上午/下午" ) return true ;
++ i ; break ;
case '[' :
o = c ;
while ( fmt . charAt ( i ++ ) !== ']' && i < fmt . length ) o += fmt . charAt ( i ) ;
if ( o . match ( abstime ) ) return true ;
break ;
case '.' :
/* falls through */
case '0' : case '#' :
while ( i < fmt . length && ( "0#?.,E+-%" . indexOf ( c = fmt . charAt ( ++ i ) ) > - 1 || ( c == '\\' && fmt . charAt ( i + 1 ) == "-" && "0#" . indexOf ( fmt . charAt ( i + 2 ) ) > - 1 ) ) ) { /* empty */ }
break ;
case '?' : while ( fmt . charAt ( ++ i ) === c ) { /* empty */ } break ;
case '*' : ++ i ; if ( fmt . charAt ( i ) == ' ' || fmt . charAt ( i ) == '*' ) ++ i ; break ;
case '(' : case ')' : ++ i ; break ;
case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' :
while ( i < fmt . length && "0123456789" . indexOf ( fmt . charAt ( ++ i ) ) > - 1 ) { /* empty */ } break ;
case ' ' : ++ i ; break ;
default : ++ i ; break ;
}
}
return false ;
}
SSF . is _date = fmt _is _date ;
function eval _fmt ( fmt /*:string*/ , v /*:any*/ , opts /*:any*/ , flen /*:number*/ ) {
var out = [ ] , o = "" , i = 0 , c = "" , lst = 't' , dt , j , cc ;
var hr = 'H' ;
/* Tokenize */
while ( i < fmt . length ) {
switch ( ( c = fmt . charAt ( i ) ) ) {
case 'G' : /* General */
if ( ! isgeneral ( fmt , i ) ) throw new Error ( 'unrecognized character ' + c + ' in ' + fmt ) ;
out [ out . length ] = { t : 'G' , v : 'General' } ; i += 7 ; break ;
case '"' : /* Literal text */
for ( o = "" ; ( cc = fmt . charCodeAt ( ++ i ) ) !== 34 && i < fmt . length ; ) o += String . fromCharCode ( cc ) ;
out [ out . length ] = { t : 't' , v : o } ; ++ i ; break ;
case '\\' : var w = fmt . charAt ( ++ i ) , t = ( w === "(" || w === ")" ) ? w : 't' ;
out [ out . length ] = { t : t , v : w } ; ++ i ; break ;
case '_' : out [ out . length ] = { t : 't' , v : " " } ; i += 2 ; break ;
case '@' : /* Text Placeholder */
out [ out . length ] = { t : 'T' , v : v } ; ++ i ; break ;
case 'B' : case 'b' :
if ( fmt . charAt ( i + 1 ) === "1" || fmt . charAt ( i + 1 ) === "2" ) {
if ( dt == null ) { dt = parse _date _code ( v , opts , fmt . charAt ( i + 1 ) === "2" ) ; if ( dt == null ) return "" ; }
out [ out . length ] = { t : 'X' , v : fmt . substr ( i , 2 ) } ; lst = c ; i += 2 ; break ;
}
/* falls through */
case 'M' : case 'D' : case 'Y' : case 'H' : case 'S' : case 'E' :
c = c . toLowerCase ( ) ;
/* falls through */
case 'm' : case 'd' : case 'y' : case 'h' : case 's' : case 'e' : case 'g' :
if ( v < 0 ) return "" ;
if ( dt == null ) { dt = parse _date _code ( v , opts ) ; if ( dt == null ) return "" ; }
o = c ; while ( ++ i < fmt . length && fmt . charAt ( i ) . toLowerCase ( ) === c ) o += c ;
if ( c === 'm' && lst . toLowerCase ( ) === 'h' ) c = 'M' ;
if ( c === 'h' ) c = hr ;
out [ out . length ] = { t : c , v : o } ; lst = c ; break ;
case 'A' : case 'a' : case '上' :
var q = { t : c , v : c } ;
if ( dt == null ) dt = parse _date _code ( v , opts ) ;
if ( fmt . substr ( i , 3 ) . toUpperCase ( ) === "A/P" ) { if ( dt != null ) q . v = dt . H >= 12 ? "P" : "A" ; q . t = 'T' ; hr = 'h' ; i += 3 ; }
else if ( fmt . substr ( i , 5 ) . toUpperCase ( ) === "AM/PM" ) { if ( dt != null ) q . v = dt . H >= 12 ? "PM" : "AM" ; q . t = 'T' ; i += 5 ; hr = 'h' ; }
else if ( fmt . substr ( i , 5 ) . toUpperCase ( ) === "上午/下午" ) { if ( dt != null ) q . v = dt . H >= 12 ? "下午" : "上午" ; q . t = 'T' ; i += 5 ; hr = 'h' ; }
else { q . t = "t" ; ++ i ; }
if ( dt == null && q . t === 'T' ) return "" ;
out [ out . length ] = q ; lst = c ; break ;
case '[' :
o = c ;
while ( fmt . charAt ( i ++ ) !== ']' && i < fmt . length ) o += fmt . charAt ( i ) ;
if ( o . slice ( - 1 ) !== ']' ) throw 'unterminated "[" block: |' + o + '|' ;
if ( o . match ( abstime ) ) {
if ( dt == null ) { dt = parse _date _code ( v , opts ) ; if ( dt == null ) return "" ; }
out [ out . length ] = { t : 'Z' , v : o . toLowerCase ( ) } ;
lst = o . charAt ( 1 ) ;
} else if ( o . indexOf ( "$" ) > - 1 ) {
o = ( o . match ( /\$([^-\[\]]*)/ ) || [ ] ) [ 1 ] || "$" ;
if ( ! fmt _is _date ( fmt ) ) out [ out . length ] = { t : 't' , v : o } ;
}
break ;
/* Numbers */
case '.' :
if ( dt != null ) {
o = c ; while ( ++ i < fmt . length && ( c = fmt . charAt ( i ) ) === "0" ) o += c ;
out [ out . length ] = { t : 's' , v : o } ; break ;
}
/* falls through */
case '0' : case '#' :
o = c ; while ( ++ i < fmt . length && "0#?.,E+-%" . indexOf ( c = fmt . charAt ( i ) ) > - 1 ) o += c ;
out [ out . length ] = { t : 'n' , v : o } ; break ;
case '?' :
o = c ; while ( fmt . charAt ( ++ i ) === c ) o += c ;
out [ out . length ] = { t : c , v : o } ; lst = c ; break ;
case '*' : ++ i ; if ( fmt . charAt ( i ) == ' ' || fmt . charAt ( i ) == '*' ) ++ i ; break ; // **
case '(' : case ')' : out [ out . length ] = { t : ( flen === 1 ? 't' : c ) , v : c } ; ++ i ; break ;
case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' :
o = c ; while ( i < fmt . length && "0123456789" . indexOf ( fmt . charAt ( ++ i ) ) > - 1 ) o += fmt . charAt ( i ) ;
out [ out . length ] = { t : 'D' , v : o } ; break ;
case ' ' : out [ out . length ] = { t : c , v : c } ; ++ i ; break ;
case '$' : out [ out . length ] = { t : 't' , v : '$' } ; ++ i ; break ;
default :
if ( ",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP" . indexOf ( c ) === - 1 ) throw new Error ( 'unrecognized character ' + c + ' in ' + fmt ) ;
out [ out . length ] = { t : 't' , v : c } ; ++ i ; break ;
}
}
/* Scan for date/time parts */
var bt = 0 , ss0 = 0 , ssm ;
for ( i = out . length - 1 , lst = 't' ; i >= 0 ; -- i ) {
switch ( out [ i ] . t ) {
case 'h' : case 'H' : out [ i ] . t = hr ; lst = 'h' ; if ( bt < 1 ) bt = 1 ; break ;
case 's' :
if ( ( ssm = out [ i ] . v . match ( /\.0+$/ ) ) ) ss0 = Math . max ( ss0 , ssm [ 0 ] . length - 1 ) ;
if ( bt < 3 ) bt = 3 ;
/* falls through */
case 'd' : case 'y' : case 'M' : case 'e' : lst = out [ i ] . t ; break ;
case 'm' : if ( lst === 's' ) { out [ i ] . t = 'M' ; if ( bt < 2 ) bt = 2 ; } break ;
case 'X' : /*if(out[i].v === "B2");*/
break ;
case 'Z' :
if ( bt < 1 && out [ i ] . v . match ( /[Hh]/ ) ) bt = 1 ;
if ( bt < 2 && out [ i ] . v . match ( /[Mm]/ ) ) bt = 2 ;
if ( bt < 3 && out [ i ] . v . match ( /[Ss]/ ) ) bt = 3 ;
}
}
/* time rounding depends on presence of minute / second / usec fields */
switch ( bt ) {
case 0 : break ;
case 1 :
/*::if(!dt) break;*/
if ( dt . u >= 0.5 ) { dt . u = 0 ; ++ dt . S ; }
if ( dt . S >= 60 ) { dt . S = 0 ; ++ dt . M ; }
if ( dt . M >= 60 ) { dt . M = 0 ; ++ dt . H ; }
break ;
case 2 :
/*::if(!dt) break;*/
if ( dt . u >= 0.5 ) { dt . u = 0 ; ++ dt . S ; }
if ( dt . S >= 60 ) { dt . S = 0 ; ++ dt . M ; }
break ;
}
/* replace fields */
var nstr = "" , jj ;
for ( i = 0 ; i < out . length ; ++ i ) {
switch ( out [ i ] . t ) {
case 't' : case 'T' : case ' ' : case 'D' : break ;
case 'X' : out [ i ] . v = "" ; out [ i ] . t = ";" ; break ;
case 'd' : case 'm' : case 'y' : case 'h' : case 'H' : case 'M' : case 's' : case 'e' : case 'b' : case 'Z' :
/*::if(!dt) throw "unreachable"; */
out [ i ] . v = write _date ( out [ i ] . t . charCodeAt ( 0 ) , out [ i ] . v , dt , ss0 ) ;
out [ i ] . t = 't' ; break ;
case 'n' : case '?' :
jj = i + 1 ;
while ( out [ jj ] != null && (
( c = out [ jj ] . t ) === "?" || c === "D" ||
( ( c === " " || c === "t" ) && out [ jj + 1 ] != null && ( out [ jj + 1 ] . t === '?' || out [ jj + 1 ] . t === "t" && out [ jj + 1 ] . v === '/' ) ) ||
( out [ i ] . t === '(' && ( c === ' ' || c === 'n' || c === ')' ) ) ||
( c === 't' && ( out [ jj ] . v === '/' || out [ jj ] . v === ' ' && out [ jj + 1 ] != null && out [ jj + 1 ] . t == '?' ) )
) ) {
out [ i ] . v += out [ jj ] . v ;
out [ jj ] = { v : "" , t : ";" } ; ++ jj ;
}
nstr += out [ i ] . v ;
i = jj - 1 ; break ;
case 'G' : out [ i ] . t = 't' ; out [ i ] . v = general _fmt ( v , opts ) ; break ;
}
}
var vv = "" , myv , ostr ;
if ( nstr . length > 0 ) {
if ( nstr . charCodeAt ( 0 ) == 40 ) /* '(' */ {
myv = ( v < 0 && nstr . charCodeAt ( 0 ) === 45 ? - v : v ) ;
ostr = write _num ( 'n' , nstr , myv ) ;
} else {
myv = ( v < 0 && flen > 1 ? - v : v ) ;
ostr = write _num ( 'n' , nstr , myv ) ;
if ( myv < 0 && out [ 0 ] && out [ 0 ] . t == 't' ) {
ostr = ostr . substr ( 1 ) ;
out [ 0 ] . v = "-" + out [ 0 ] . v ;
}
}
jj = ostr . length - 1 ;
var decpt = out . length ;
for ( i = 0 ; i < out . length ; ++ i ) if ( out [ i ] != null && out [ i ] . t != 't' && out [ i ] . v . indexOf ( "." ) > - 1 ) { decpt = i ; break ; }
var lasti = out . length ;
if ( decpt === out . length && ostr . indexOf ( "E" ) === - 1 ) {
for ( i = out . length - 1 ; i >= 0 ; -- i ) {
if ( out [ i ] == null || 'n?' . indexOf ( out [ i ] . t ) === - 1 ) continue ;
if ( jj >= out [ i ] . v . length - 1 ) { jj -= out [ i ] . v . length ; out [ i ] . v = ostr . substr ( jj + 1 , out [ i ] . v . length ) ; }
else if ( jj < 0 ) out [ i ] . v = "" ;
else { out [ i ] . v = ostr . substr ( 0 , jj + 1 ) ; jj = - 1 ; }
out [ i ] . t = 't' ;
lasti = i ;
}
if ( jj >= 0 && lasti < out . length ) out [ lasti ] . v = ostr . substr ( 0 , jj + 1 ) + out [ lasti ] . v ;
}
else if ( decpt !== out . length && ostr . indexOf ( "E" ) === - 1 ) {
jj = ostr . indexOf ( "." ) - 1 ;
for ( i = decpt ; i >= 0 ; -- i ) {
if ( out [ i ] == null || 'n?' . indexOf ( out [ i ] . t ) === - 1 ) continue ;
j = out [ i ] . v . indexOf ( "." ) > - 1 && i === decpt ? out [ i ] . v . indexOf ( "." ) - 1 : out [ i ] . v . length - 1 ;
vv = out [ i ] . v . substr ( j + 1 ) ;
for ( ; j >= 0 ; -- j ) {
if ( jj >= 0 && ( out [ i ] . v . charAt ( j ) === "0" || out [ i ] . v . charAt ( j ) === "#" ) ) vv = ostr . charAt ( jj -- ) + vv ;
}
out [ i ] . v = vv ;
out [ i ] . t = 't' ;
lasti = i ;
}
if ( jj >= 0 && lasti < out . length ) out [ lasti ] . v = ostr . substr ( 0 , jj + 1 ) + out [ lasti ] . v ;
jj = ostr . indexOf ( "." ) + 1 ;
for ( i = decpt ; i < out . length ; ++ i ) {
if ( out [ i ] == null || ( 'n?(' . indexOf ( out [ i ] . t ) === - 1 && i !== decpt ) ) continue ;
j = out [ i ] . v . indexOf ( "." ) > - 1 && i === decpt ? out [ i ] . v . indexOf ( "." ) + 1 : 0 ;
vv = out [ i ] . v . substr ( 0 , j ) ;
for ( ; j < out [ i ] . v . length ; ++ j ) {
if ( jj < ostr . length ) vv += ostr . charAt ( jj ++ ) ;
}
out [ i ] . v = vv ;
out [ i ] . t = 't' ;
lasti = i ;
}
}
}
for ( i = 0 ; i < out . length ; ++ i ) if ( out [ i ] != null && 'n?' . indexOf ( out [ i ] . t ) > - 1 ) {
myv = ( flen > 1 && v < 0 && i > 0 && out [ i - 1 ] . v === "-" ? - v : v ) ;
out [ i ] . v = write _num ( out [ i ] . t , out [ i ] . v , myv ) ;
out [ i ] . t = 't' ;
}
var retval = "" ;
for ( i = 0 ; i !== out . length ; ++ i ) if ( out [ i ] != null ) retval += out [ i ] . v ;
return retval ;
}
SSF . _eval = eval _fmt ;
var cfregex = /\[[=<>]/ ;
var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/ ;
function chkcond ( v , rr ) {
if ( rr == null ) return false ;
var thresh = parseFloat ( rr [ 2 ] ) ;
switch ( rr [ 1 ] ) {
case "=" : if ( v == thresh ) return true ; break ;
case ">" : if ( v > thresh ) return true ; break ;
case "<" : if ( v < thresh ) return true ; break ;
case "<>" : if ( v != thresh ) return true ; break ;
case ">=" : if ( v >= thresh ) return true ; break ;
case "<=" : if ( v <= thresh ) return true ; break ;
}
return false ;
}
function choose _fmt ( f /*:string*/ , v /*:any*/ ) {
var fmt = split _fmt ( f ) ;
var l = fmt . length , lat = fmt [ l - 1 ] . indexOf ( "@" ) ;
if ( l < 4 && lat > - 1 ) -- l ;
if ( fmt . length > 4 ) throw new Error ( "cannot find right format for |" + fmt . join ( "|" ) + "|" ) ;
if ( typeof v !== "number" ) return [ 4 , fmt . length === 4 || lat > - 1 ? fmt [ fmt . length - 1 ] : "@" ] ;
switch ( fmt . length ) {
case 1 : fmt = lat > - 1 ? [ "General" , "General" , "General" , fmt [ 0 ] ] : [ fmt [ 0 ] , fmt [ 0 ] , fmt [ 0 ] , "@" ] ; break ;
case 2 : fmt = lat > - 1 ? [ fmt [ 0 ] , fmt [ 0 ] , fmt [ 0 ] , fmt [ 1 ] ] : [ fmt [ 0 ] , fmt [ 1 ] , fmt [ 0 ] , "@" ] ; break ;
case 3 : fmt = lat > - 1 ? [ fmt [ 0 ] , fmt [ 1 ] , fmt [ 0 ] , fmt [ 2 ] ] : [ fmt [ 0 ] , fmt [ 1 ] , fmt [ 2 ] , "@" ] ; break ;
case 4 : break ;
}
var ff = v > 0 ? fmt [ 0 ] : v < 0 ? fmt [ 1 ] : fmt [ 2 ] ;
if ( fmt [ 0 ] . indexOf ( "[" ) === - 1 && fmt [ 1 ] . indexOf ( "[" ) === - 1 ) return [ l , ff ] ;
if ( fmt [ 0 ] . match ( cfregex ) != null || fmt [ 1 ] . match ( cfregex ) != null ) {
var m1 = fmt [ 0 ] . match ( cfregex2 ) ;
var m2 = fmt [ 1 ] . match ( cfregex2 ) ;
return chkcond ( v , m1 ) ? [ l , fmt [ 0 ] ] : chkcond ( v , m2 ) ? [ l , fmt [ 1 ] ] : [ l , fmt [ m1 != null && m2 != null ? 2 : 1 ] ] ;
}
return [ l , ff ] ;
}
function format ( fmt /*:string|number*/ , v /*:any*/ , o /*:?any*/ ) {
if ( o == null ) o = { } ;
var sfmt = "" ;
switch ( typeof fmt ) {
case "string" :
if ( fmt == "m/d/yy" && o . dateNF ) sfmt = o . dateNF ;
else sfmt = fmt ;
break ;
case "number" :
if ( fmt == 14 && o . dateNF ) sfmt = o . dateNF ;
else sfmt = ( o . table != null ? ( o . table /*:any*/ ) : table _fmt ) [ fmt ] ;
if ( sfmt == null ) sfmt = ( o . table && o . table [ default _map [ fmt ] ] ) || table _fmt [ default _map [ fmt ] ] ;
if ( sfmt == null ) sfmt = default _str [ fmt ] || "General" ;
break ;
}
if ( isgeneral ( sfmt , 0 ) ) return general _fmt ( v , o ) ;
if ( v instanceof Date ) v = datenum _local ( v , o . date1904 ) ;
var f = choose _fmt ( sfmt , v ) ;
if ( isgeneral ( f [ 1 ] ) ) return general _fmt ( v , o ) ;
if ( v === true ) v = "TRUE" ; else if ( v === false ) v = "FALSE" ;
else if ( v === "" || v == null ) return "" ;
return eval _fmt ( f [ 1 ] , v , o , f [ 0 ] ) ;
}
function load _entry ( fmt /*:string*/ , idx /*:?number*/ ) /*:number*/ {
if ( typeof idx != 'number' ) {
idx = + idx || - 1 ;
/*::if(typeof idx != 'number') return 0x188; */
for ( var i = 0 ; i < 0x0188 ; ++ i ) {
/*::if(typeof idx != 'number') return 0x188; */
if ( table _fmt [ i ] == undefined ) { if ( idx < 0 ) idx = i ; continue ; }
if ( table _fmt [ i ] == fmt ) { idx = i ; break ; }
}
/*::if(typeof idx != 'number') return 0x188; */
if ( idx < 0 ) idx = 0x187 ;
}
/*::if(typeof idx != 'number') return 0x188; */
table _fmt [ idx ] = fmt ;
return idx ;
}
SSF . load = load _entry ;
SSF . _table = table _fmt ;
SSF . get _table = function get _table ( ) /*:SSFTable*/ { return table _fmt ; } ;
SSF . load _table = function load _table ( tbl /*:SSFTable*/ ) /*:void*/ {
for ( var i = 0 ; i != 0x0188 ; ++ i )
if ( tbl [ i ] !== undefined ) load _entry ( tbl [ i ] , i ) ;
} ;
SSF . init _table = init _table ;
SSF . format = format ;
} ;
make _ssf ( SSF ) ;
/* map from xlml named formats to SSF TODO: localize */
var XLMLFormatMap /*{[string]:string}*/ = ( {
"General Number" : "General" ,
"General Date" : SSF . _table [ 22 ] ,
"Long Date" : "dddd, mmmm dd, yyyy" ,
"Medium Date" : SSF . _table [ 15 ] ,
"Short Date" : SSF . _table [ 14 ] ,
"Long Time" : SSF . _table [ 19 ] ,
"Medium Time" : SSF . _table [ 18 ] ,
"Short Time" : SSF . _table [ 20 ] ,
"Currency" : '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' ,
"Fixed" : SSF . _table [ 2 ] ,
"Standard" : SSF . _table [ 4 ] ,
"Percent" : SSF . _table [ 10 ] ,
"Scientific" : SSF . _table [ 11 ] ,
"Yes/No" : '"Yes";"Yes";"No";@' ,
"True/False" : '"True";"True";"False";@' ,
"On/Off" : '"Yes";"Yes";"No";@'
} /*:any*/ ) ;
var SSFImplicit /*{[number]:string}*/ = ( {
"5" : '"$"#,##0_);\\("$"#,##0\\)' ,
"6" : '"$"#,##0_);[Red]\\("$"#,##0\\)' ,
"7" : '"$"#,##0.00_);\\("$"#,##0.00\\)' ,
"8" : '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' ,
"23" : 'General' , "24" : 'General' , "25" : 'General' , "26" : 'General' ,
"27" : 'm/d/yy' , "28" : 'm/d/yy' , "29" : 'm/d/yy' , "30" : 'm/d/yy' , "31" : 'm/d/yy' ,
"32" : 'h:mm:ss' , "33" : 'h:mm:ss' , "34" : 'h:mm:ss' , "35" : 'h:mm:ss' ,
"36" : 'm/d/yy' ,
"41" : '_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)' ,
"42" : '_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_)' ,
"43" : '_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)' ,
"44" : '_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)' ,
"50" : 'm/d/yy' , "51" : 'm/d/yy' , "52" : 'm/d/yy' , "53" : 'm/d/yy' , "54" : 'm/d/yy' ,
"55" : 'm/d/yy' , "56" : 'm/d/yy' , "57" : 'm/d/yy' , "58" : 'm/d/yy' ,
"59" : '0' ,
"60" : '0.00' ,
"61" : '#,##0' ,
"62" : '#,##0.00' ,
"63" : '"$"#,##0_);\\("$"#,##0\\)' ,
"64" : '"$"#,##0_);[Red]\\("$"#,##0\\)' ,
"65" : '"$"#,##0.00_);\\("$"#,##0.00\\)' ,
"66" : '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)' ,
"67" : '0%' ,
"68" : '0.00%' ,
"69" : '# ?/?' ,
"70" : '# ??/??' ,
"71" : 'm/d/yy' ,
"72" : 'm/d/yy' ,
"73" : 'd-mmm-yy' ,
"74" : 'd-mmm' ,
"75" : 'mmm-yy' ,
"76" : 'h:mm' ,
"77" : 'h:mm:ss' ,
"78" : 'm/d/yy h:mm' ,
"79" : 'mm:ss' ,
"80" : '[h]:mm:ss' ,
"81" : 'mmss.0'
} /*:any*/ ) ;
/* dateNF parse TODO: move to SSF */
var dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g ;
function dateNF _regex ( dateNF /*:string|number*/ ) /*:RegExp*/ {
var fmt = typeof dateNF == "number" ? SSF . _table [ dateNF ] : dateNF ;
fmt = fmt . replace ( dateNFregex , "(\\d+)" ) ;
return new RegExp ( "^" + fmt + "$" ) ;
}
function dateNF _fix ( str /*:string*/ , dateNF /*:string*/ , match /*:Array<string>*/ ) /*:string*/ {
var Y = - 1 , m = - 1 , d = - 1 , H = - 1 , M = - 1 , S = - 1 ;
( dateNF . match ( dateNFregex ) || [ ] ) . forEach ( function ( n , i ) {
var v = parseInt ( match [ i + 1 ] , 10 ) ;
switch ( n . toLowerCase ( ) . charAt ( 0 ) ) {
case 'y' : Y = v ; break ; case 'd' : d = v ; break ;
case 'h' : H = v ; break ; case 's' : S = v ; break ;
case 'm' : if ( H >= 0 ) M = v ; else m = v ; break ;
}
} ) ;
if ( S >= 0 && M == - 1 && m >= 0 ) { M = m ; m = - 1 ; }
var datestr = ( ( "" + ( Y >= 0 ? Y : new Date ( ) . getFullYear ( ) ) ) . slice ( - 4 ) + "-" + ( "00" + ( m >= 1 ? m : 1 ) ) . slice ( - 2 ) + "-" + ( "00" + ( d >= 1 ? d : 1 ) ) . slice ( - 2 ) ) ;
if ( datestr . length == 7 ) datestr = "0" + datestr ;
if ( datestr . length == 8 ) datestr = "20" + datestr ;
var timestr = ( ( "00" + ( H >= 0 ? H : 0 ) ) . slice ( - 2 ) + ":" + ( "00" + ( M >= 0 ? M : 0 ) ) . slice ( - 2 ) + ":" + ( "00" + ( S >= 0 ? S : 0 ) ) . slice ( - 2 ) ) ;
if ( H == - 1 && M == - 1 && S == - 1 ) return datestr ;
if ( Y == - 1 && m == - 1 && d == - 1 ) return timestr ;
return datestr + "T" + timestr ;
}
var DO _NOT _EXPORT _CFB = true ;
/ * : :
declare var Base64 : any ;
declare var ReadShift : any ;
declare var CheckField : any ;
declare var prep _blob : any ;
declare var _ _readUInt32LE : any ;
declare var _ _readInt32LE : any ;
declare var _ _toBuffer : any ;
declare var _ _utf16le : any ;
declare var bconcat : any ;
declare var s2a : any ;
declare var chr0 : any ;
declare var chr1 : any ;
declare var has _buf : boolean ;
declare var new _buf : any ;
declare var new _raw _buf : any ;
declare var new _unsafe _buf : any ;
* /
/* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */
/*jshint eqnull:true */
/*exported CFB */
/*global Uint8Array:false, Uint16Array:false */
/ * : :
declare var DO _NOT _EXPORT _CFB : ? boolean ;
type SectorEntry = {
name ? : string ;
nodes ? : Array < number > ;
data : RawBytes ;
} ;
type SectorList = {
[ k : string | number ] : SectorEntry ;
name : ? string ;
fat _addrs : Array < number > ;
ssz : number ;
}
type CFBFiles = { [ n : string ] : CFBEntry } ;
* /
/* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */
/*exported CRC32 */
var CRC32 ;
( function ( factory ) {
/*jshint ignore:start */
/*eslint-disable */
factory ( CRC32 = { } ) ;
/*eslint-enable */
/*jshint ignore:end */
} ( function ( CRC32 ) {
CRC32 . version = '1.2.0' ;
/* see perf/crc32table.js */
/*global Int32Array */
function signed _crc _table ( ) /*:any*/ {
var c = 0 , table /*:Array<number>*/ = new Array ( 256 ) ;
for ( var n = 0 ; n != 256 ; ++ n ) {
c = n ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
c = ( ( c & 1 ) ? ( - 306674912 ^ ( c >>> 1 ) ) : ( c >>> 1 ) ) ;
table [ n ] = c ;
}
return typeof Int32Array !== 'undefined' ? new Int32Array ( table ) : table ;
}
var T = signed _crc _table ( ) ;
function crc32 _bstr ( bstr /*:string*/ , seed /*:number*/ ) /*:number*/ {
var C = seed ^ - 1 , L = bstr . length - 1 ;
for ( var i = 0 ; i < L ; ) {
C = ( C >>> 8 ) ^ T [ ( C ^ bstr . charCodeAt ( i ++ ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ bstr . charCodeAt ( i ++ ) ) & 0xFF ] ;
}
if ( i === L ) C = ( C >>> 8 ) ^ T [ ( C ^ bstr . charCodeAt ( i ) ) & 0xFF ] ;
return C ^ - 1 ;
}
function crc32 _buf ( buf /*:Uint8Array|Array<number>*/ , seed /*:number*/ ) /*:number*/ {
if ( buf . length > 10000 ) return crc32 _buf _8 ( buf , seed ) ;
var C = seed ^ - 1 , L = buf . length - 3 ;
for ( var i = 0 ; i < L ; ) {
C = ( C >>> 8 ) ^ T [ ( C ^ buf [ i ++ ] ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ buf [ i ++ ] ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ buf [ i ++ ] ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ buf [ i ++ ] ) & 0xFF ] ;
}
while ( i < L + 3 ) C = ( C >>> 8 ) ^ T [ ( C ^ buf [ i ++ ] ) & 0xFF ] ;
return C ^ - 1 ;
}
function crc32 _buf _8 ( buf /*:Uint8Array|Array<number>*/ , seed /*:number*/ ) /*:number*/ {
var C = seed ^ - 1 , L = buf . length - 7 ;
for ( var i = 0 ; i < L ; ) {
C = ( C >>> 8 ) ^ T [ ( C ^ buf [ i ++ ] ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ buf [ i ++ ] ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ buf [ i ++ ] ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ buf [ i ++ ] ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ buf [ i ++ ] ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ buf [ i ++ ] ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ buf [ i ++ ] ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ buf [ i ++ ] ) & 0xFF ] ;
}
while ( i < L + 7 ) C = ( C >>> 8 ) ^ T [ ( C ^ buf [ i ++ ] ) & 0xFF ] ;
return C ^ - 1 ;
}
function crc32 _str ( str /*:string*/ , seed /*:number*/ ) /*:number*/ {
var C = seed ^ - 1 ;
for ( var i = 0 , L = str . length , c , d ; i < L ; ) {
c = str . charCodeAt ( i ++ ) ;
if ( c < 0x80 ) {
C = ( C >>> 8 ) ^ T [ ( C ^ c ) & 0xFF ] ;
} else if ( c < 0x800 ) {
C = ( C >>> 8 ) ^ T [ ( C ^ ( 192 | ( ( c >> 6 ) & 31 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ ( 128 | ( c & 63 ) ) ) & 0xFF ] ;
} else if ( c >= 0xD800 && c < 0xE000 ) {
c = ( c & 1023 ) + 64 ; d = str . charCodeAt ( i ++ ) & 1023 ;
C = ( C >>> 8 ) ^ T [ ( C ^ ( 240 | ( ( c >> 8 ) & 7 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ ( 128 | ( ( c >> 2 ) & 63 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ ( 128 | ( ( d >> 6 ) & 15 ) | ( ( c & 3 ) << 4 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ ( 128 | ( d & 63 ) ) ) & 0xFF ] ;
} else {
C = ( C >>> 8 ) ^ T [ ( C ^ ( 224 | ( ( c >> 12 ) & 15 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ ( 128 | ( ( c >> 6 ) & 63 ) ) ) & 0xFF ] ;
C = ( C >>> 8 ) ^ T [ ( C ^ ( 128 | ( c & 63 ) ) ) & 0xFF ] ;
}
}
return C ^ - 1 ;
}
CRC32 . table = T ;
CRC32 . bstr = crc32 _bstr ;
CRC32 . buf = crc32 _buf ;
CRC32 . str = crc32 _str ;
} ) ) ;
/* [MS-CFB] v20171201 */
var CFB = ( function _CFB ( ) {
var exports /*:CFBModule*/ = /*::(*/ { } /*:: :any)*/ ;
exports . version = '1.1.4' ;
/* [MS-CFB] 2.6.4 */
function namecmp ( l /*:string*/ , r /*:string*/ ) /*:number*/ {
var L = l . split ( "/" ) , R = r . split ( "/" ) ;
for ( var i = 0 , c = 0 , Z = Math . min ( L . length , R . length ) ; i < Z ; ++ i ) {
if ( ( c = L [ i ] . length - R [ i ] . length ) ) return c ;
if ( L [ i ] != R [ i ] ) return L [ i ] < R [ i ] ? - 1 : 1 ;
}
return L . length - R . length ;
}
function dirname ( p /*:string*/ ) /*:string*/ {
if ( p . charAt ( p . length - 1 ) == "/" ) return ( p . slice ( 0 , - 1 ) . indexOf ( "/" ) === - 1 ) ? p : dirname ( p . slice ( 0 , - 1 ) ) ;
var c = p . lastIndexOf ( "/" ) ;
return ( c === - 1 ) ? p : p . slice ( 0 , c + 1 ) ;
}
function filename ( p /*:string*/ ) /*:string*/ {
if ( p . charAt ( p . length - 1 ) == "/" ) return filename ( p . slice ( 0 , - 1 ) ) ;
var c = p . lastIndexOf ( "/" ) ;
return ( c === - 1 ) ? p : p . slice ( c + 1 ) ;
}
/* -------------------------------------------------------------------------- */
/ * D O S D a t e f o r m a t :
high | YYYYYYYm . mmmddddd . HHHHHMMM . MMMSSSSS | low
add 1980 to stored year
stored second should be doubled
* /
/* write JS date to buf as a DOS date */
function write _dos _date ( buf /*:CFBlob*/ , date /*:Date|string*/ ) {
if ( typeof date === "string" ) date = new Date ( date ) ;
var hms /*:number*/ = date . getHours ( ) ;
hms = hms << 6 | date . getMinutes ( ) ;
hms = hms << 5 | ( date . getSeconds ( ) >>> 1 ) ;
buf . write _shift ( 2 , hms ) ;
var ymd /*:number*/ = ( date . getFullYear ( ) - 1980 ) ;
ymd = ymd << 4 | ( date . getMonth ( ) + 1 ) ;
ymd = ymd << 5 | date . getDate ( ) ;
buf . write _shift ( 2 , ymd ) ;
}
/* read four bytes from buf and interpret as a DOS date */
function parse _dos _date ( buf /*:CFBlob*/ ) /*:Date*/ {
var hms = buf . read _shift ( 2 ) & 0xFFFF ;
var ymd = buf . read _shift ( 2 ) & 0xFFFF ;
var val = new Date ( ) ;
var d = ymd & 0x1F ; ymd >>>= 5 ;
var m = ymd & 0x0F ; ymd >>>= 4 ;
val . setMilliseconds ( 0 ) ;
val . setFullYear ( ymd + 1980 ) ;
val . setMonth ( m - 1 ) ;
val . setDate ( d ) ;
var S = hms & 0x1F ; hms >>>= 5 ;
var M = hms & 0x3F ; hms >>>= 6 ;
val . setHours ( hms ) ;
val . setMinutes ( M ) ;
val . setSeconds ( S << 1 ) ;
return val ;
}
function parse _extra _field ( blob /*:CFBlob*/ ) /*:any*/ {
prep _blob ( blob , 0 ) ;
var o = /*::(*/ { } /*:: :any)*/ ;
var flags = 0 ;
while ( blob . l <= blob . length - 4 ) {
var type = blob . read _shift ( 2 ) ;
var sz = blob . read _shift ( 2 ) , tgt = blob . l + sz ;
var p = { } ;
switch ( type ) {
/* UNIX-style Timestamps */
case 0x5455 : {
flags = blob . read _shift ( 1 ) ;
if ( flags & 1 ) p . mtime = blob . read _shift ( 4 ) ;
/* for some reason, CD flag corresponds to LFH */
if ( sz > 5 ) {
if ( flags & 2 ) p . atime = blob . read _shift ( 4 ) ;
if ( flags & 4 ) p . ctime = blob . read _shift ( 4 ) ;
}
if ( p . mtime ) p . mt = new Date ( p . mtime * 1000 ) ;
}
break ;
}
blob . l = tgt ;
o [ type ] = p ;
}
return o ;
}
var fs /*:: = require('fs'); */ ;
function get _fs ( ) { return fs || ( fs = { } ) ; }
function parse ( file /*:RawBytes*/ , options /*:CFBReadOpts*/ ) /*:CFBContainer*/ {
if ( file [ 0 ] == 0x50 && file [ 1 ] == 0x4b ) return parse _zip ( file , options ) ;
if ( file . length < 512 ) throw new Error ( "CFB file size " + file . length + " < 512" ) ;
var mver = 3 ;
var ssz = 512 ;
var nmfs = 0 ; // number of mini FAT sectors
var difat _sec _cnt = 0 ;
var dir _start = 0 ;
var minifat _start = 0 ;
var difat _start = 0 ;
var fat _addrs /*:Array<number>*/ = [ ] ; // locations of FAT sectors
/* [MS-CFB] 2.2 Compound File Header */
var blob /*:CFBlob*/ = /*::(*/ file . slice ( 0 , 512 ) /*:: :any)*/ ;
prep _blob ( blob , 0 ) ;
/* major version */
var mv = check _get _mver ( blob ) ;
mver = mv [ 0 ] ;
switch ( mver ) {
case 3 : ssz = 512 ; break ; case 4 : ssz = 4096 ; break ;
case 0 : if ( mv [ 1 ] == 0 ) return parse _zip ( file , options ) ;
/* falls through */
default : throw new Error ( "Major Version: Expected 3 or 4 saw " + mver ) ;
}
/* reprocess header */
if ( ssz !== 512 ) { blob = /*::(*/ file . slice ( 0 , ssz ) /*:: :any)*/ ; prep _blob ( blob , 28 /* blob.l */ ) ; }
/* Save header for final object */
var header /*:RawBytes*/ = file . slice ( 0 , ssz ) ;
check _shifts ( blob , mver ) ;
// Number of Directory Sectors
var dir _cnt /*:number*/ = blob . read _shift ( 4 , 'i' ) ;
if ( mver === 3 && dir _cnt !== 0 ) throw new Error ( '# Directory Sectors: Expected 0 saw ' + dir _cnt ) ;
// Number of FAT Sectors
blob . l += 4 ;
// First Directory Sector Location
dir _start = blob . read _shift ( 4 , 'i' ) ;
// Transaction Signature
blob . l += 4 ;
// Mini Stream Cutoff Size
blob . chk ( '00100000' , 'Mini Stream Cutoff Size: ' ) ;
// First Mini FAT Sector Location
minifat _start = blob . read _shift ( 4 , 'i' ) ;
// Number of Mini FAT Sectors
nmfs = blob . read _shift ( 4 , 'i' ) ;
// First DIFAT sector location
difat _start = blob . read _shift ( 4 , 'i' ) ;
// Number of DIFAT Sectors
difat _sec _cnt = blob . read _shift ( 4 , 'i' ) ;
// Grab FAT Sector Locations
for ( var q = - 1 , j = 0 ; j < 109 ; ++ j ) { /* 109 = (512 - blob.l)>>>2; */
q = blob . read _shift ( 4 , 'i' ) ;
if ( q < 0 ) break ;
fat _addrs [ j ] = q ;
}
/** Break the file up into sectors */
var sectors /*:Array<RawBytes>*/ = sectorify ( file , ssz ) ;
sleuth _fat ( difat _start , difat _sec _cnt , sectors , ssz , fat _addrs ) ;
/** Chains */
var sector _list /*:SectorList*/ = make _sector _list ( sectors , dir _start , fat _addrs , ssz ) ;
sector _list [ dir _start ] . name = "!Directory" ;
if ( nmfs > 0 && minifat _start !== ENDOFCHAIN ) sector _list [ minifat _start ] . name = "!MiniFAT" ;
sector _list [ fat _addrs [ 0 ] ] . name = "!FAT" ;
sector _list . fat _addrs = fat _addrs ;
sector _list . ssz = ssz ;
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
var files /*:CFBFiles*/ = { } , Paths /*:Array<string>*/ = [ ] , FileIndex /*:CFBFileIndex*/ = [ ] , FullPaths /*:Array<string>*/ = [ ] ;
read _directory ( dir _start , sector _list , sectors , Paths , nmfs , files , FileIndex , minifat _start ) ;
build _full _paths ( FileIndex , FullPaths , Paths ) ;
Paths . shift ( ) ;
var o = {
FileIndex : FileIndex ,
FullPaths : FullPaths
} ;
// $FlowIgnore
if ( options && options . raw ) o . raw = { header : header , sectors : sectors } ;
return o ;
} // parse
/* [MS-CFB] 2.2 Compound File Header -- read up to major version */
function check _get _mver ( blob /*:CFBlob*/ ) /*:[number, number]*/ {
if ( blob [ blob . l ] == 0x50 && blob [ blob . l + 1 ] == 0x4b ) return [ 0 , 0 ] ;
// header signature 8
blob . chk ( HEADER _SIGNATURE , 'Header Signature: ' ) ;
// clsid 16
//blob.chk(HEADER_CLSID, 'CLSID: ');
blob . l += 16 ;
// minor version 2
var mver /*:number*/ = blob . read _shift ( 2 , 'u' ) ;
return [ blob . read _shift ( 2 , 'u' ) , mver ] ;
}
function check _shifts ( blob /*:CFBlob*/ , mver /*:number*/ ) /*:void*/ {
var shift = 0x09 ;
// Byte Order
//blob.chk('feff', 'Byte Order: '); // note: some writers put 0xffff
blob . l += 2 ;
// Sector Shift
switch ( ( shift = blob . read _shift ( 2 ) ) ) {
case 0x09 : if ( mver != 3 ) throw new Error ( 'Sector Shift: Expected 9 saw ' + shift ) ; break ;
case 0x0c : if ( mver != 4 ) throw new Error ( 'Sector Shift: Expected 12 saw ' + shift ) ; break ;
default : throw new Error ( 'Sector Shift: Expected 9 or 12 saw ' + shift ) ;
}
// Mini Sector Shift
blob . chk ( '0600' , 'Mini Sector Shift: ' ) ;
// Reserved
blob . chk ( '000000000000' , 'Reserved: ' ) ;
}
/** Break the file up into sectors */
function sectorify ( file /*:RawBytes*/ , ssz /*:number*/ ) /*:Array<RawBytes>*/ {
var nsectors = Math . ceil ( file . length / ssz ) - 1 ;
var sectors /*:Array<RawBytes>*/ = [ ] ;
for ( var i = 1 ; i < nsectors ; ++ i ) sectors [ i - 1 ] = file . slice ( i * ssz , ( i + 1 ) * ssz ) ;
sectors [ nsectors - 1 ] = file . slice ( nsectors * ssz ) ;
return sectors ;
}
/* [MS-CFB] 2.6.4 Red-Black Tree */
function build _full _paths ( FI /*:CFBFileIndex*/ , FP /*:Array<string>*/ , Paths /*:Array<string>*/ ) /*:void*/ {
var i = 0 , L = 0 , R = 0 , C = 0 , j = 0 , pl = Paths . length ;
var dad /*:Array<number>*/ = [ ] , q /*:Array<number>*/ = [ ] ;
for ( ; i < pl ; ++ i ) { dad [ i ] = q [ i ] = i ; FP [ i ] = Paths [ i ] ; }
for ( ; j < q . length ; ++ j ) {
i = q [ j ] ;
L = FI [ i ] . L ; R = FI [ i ] . R ; C = FI [ i ] . C ;
if ( dad [ i ] === i ) {
if ( L !== - 1 /*NOSTREAM*/ && dad [ L ] !== L ) dad [ i ] = dad [ L ] ;
if ( R !== - 1 && dad [ R ] !== R ) dad [ i ] = dad [ R ] ;
}
if ( C !== - 1 /*NOSTREAM*/ ) dad [ C ] = i ;
if ( L !== - 1 && i != dad [ i ] ) { dad [ L ] = dad [ i ] ; if ( q . lastIndexOf ( L ) < j ) q . push ( L ) ; }
if ( R !== - 1 && i != dad [ i ] ) { dad [ R ] = dad [ i ] ; if ( q . lastIndexOf ( R ) < j ) q . push ( R ) ; }
}
for ( i = 1 ; i < pl ; ++ i ) if ( dad [ i ] === i ) {
if ( R !== - 1 /*NOSTREAM*/ && dad [ R ] !== R ) dad [ i ] = dad [ R ] ;
else if ( L !== - 1 && dad [ L ] !== L ) dad [ i ] = dad [ L ] ;
}
for ( i = 1 ; i < pl ; ++ i ) {
if ( FI [ i ] . type === 0 /* unknown */ ) continue ;
j = i ;
if ( j != dad [ j ] ) do {
j = dad [ j ] ;
FP [ i ] = FP [ j ] + "/" + FP [ i ] ;
} while ( j !== 0 && - 1 !== dad [ j ] && j != dad [ j ] ) ;
dad [ i ] = - 1 ;
}
FP [ 0 ] += "/" ;
for ( i = 1 ; i < pl ; ++ i ) {
if ( FI [ i ] . type !== 2 /* stream */ ) FP [ i ] += "/" ;
}
}
function get _mfat _entry ( entry /*:CFBEntry*/ , payload /*:RawBytes*/ , mini /*:?RawBytes*/ ) /*:CFBlob*/ {
var start = entry . start , size = entry . size ;
//return (payload.slice(start*MSSZ, start*MSSZ + size)/*:any*/);
var o = [ ] ;
var idx = start ;
while ( mini && size > 0 && idx >= 0 ) {
o . push ( payload . slice ( idx * MSSZ , idx * MSSZ + MSSZ ) ) ;
size -= MSSZ ;
idx = _ _readInt32LE ( mini , idx * 4 ) ;
}
if ( o . length === 0 ) return ( new _buf ( 0 ) /*:any*/ ) ;
return ( bconcat ( o ) . slice ( 0 , entry . size ) /*:any*/ ) ;
}
/ * * C h a s e d o w n t h e r e s t o f t h e D I F A T c h a i n t o b u i l d a c o m p r e h e n s i v e l i s t
DIFAT chains by storing the next sector number as the last 32 bits * /
function sleuth _fat ( idx /*:number*/ , cnt /*:number*/ , sectors /*:Array<RawBytes>*/ , ssz /*:number*/ , fat _addrs ) /*:void*/ {
var q /*:number*/ = ENDOFCHAIN ;
if ( idx === ENDOFCHAIN ) {
if ( cnt !== 0 ) throw new Error ( "DIFAT chain shorter than expected" ) ;
} else if ( idx !== - 1 /*FREESECT*/ ) {
var sector = sectors [ idx ] , m = ( ssz >>> 2 ) - 1 ;
if ( ! sector ) return ;
for ( var i = 0 ; i < m ; ++ i ) {
if ( ( q = _ _readInt32LE ( sector , i * 4 ) ) === ENDOFCHAIN ) break ;
fat _addrs . push ( q ) ;
}
sleuth _fat ( _ _readInt32LE ( sector , ssz - 4 ) , cnt - 1 , sectors , ssz , fat _addrs ) ;
}
}
/** Follow the linked list of sectors for a given starting point */
function get _sector _list ( sectors /*:Array<RawBytes>*/ , start /*:number*/ , fat _addrs /*:Array<number>*/ , ssz /*:number*/ , chkd /*:?Array<boolean>*/ ) /*:SectorEntry*/ {
var buf /*:Array<number>*/ = [ ] , buf _chain /*:Array<any>*/ = [ ] ;
if ( ! chkd ) chkd = [ ] ;
var modulus = ssz - 1 , j = 0 , jj = 0 ;
for ( j = start ; j >= 0 ; ) {
chkd [ j ] = true ;
buf [ buf . length ] = j ;
buf _chain . push ( sectors [ j ] ) ;
var addr = fat _addrs [ Math . floor ( j * 4 / ssz ) ] ;
jj = ( ( j * 4 ) & modulus ) ;
if ( ssz < 4 + jj ) throw new Error ( "FAT boundary crossed: " + j + " 4 " + ssz ) ;
if ( ! sectors [ addr ] ) break ;
j = _ _readInt32LE ( sectors [ addr ] , jj ) ;
}
return { nodes : buf , data : _ _toBuffer ( [ buf _chain ] ) } ;
}
/** Chase down the sector linked lists */
function make _sector _list ( sectors /*:Array<RawBytes>*/ , dir _start /*:number*/ , fat _addrs /*:Array<number>*/ , ssz /*:number*/ ) /*:SectorList*/ {
var sl = sectors . length , sector _list /*:SectorList*/ = ( [ ] /*:any*/ ) ;
var chkd /*:Array<boolean>*/ = [ ] , buf /*:Array<number>*/ = [ ] , buf _chain /*:Array<RawBytes>*/ = [ ] ;
var modulus = ssz - 1 , i = 0 , j = 0 , k = 0 , jj = 0 ;
for ( i = 0 ; i < sl ; ++ i ) {
buf = ( [ ] /*:Array<number>*/ ) ;
k = ( i + dir _start ) ; if ( k >= sl ) k -= sl ;
if ( chkd [ k ] ) continue ;
buf _chain = [ ] ;
var seen = [ ] ;
for ( j = k ; j >= 0 ; ) {
seen [ j ] = true ;
chkd [ j ] = true ;
buf [ buf . length ] = j ;
buf _chain . push ( sectors [ j ] ) ;
var addr /*:number*/ = fat _addrs [ Math . floor ( j * 4 / ssz ) ] ;
jj = ( ( j * 4 ) & modulus ) ;
if ( ssz < 4 + jj ) throw new Error ( "FAT boundary crossed: " + j + " 4 " + ssz ) ;
if ( ! sectors [ addr ] ) break ;
j = _ _readInt32LE ( sectors [ addr ] , jj ) ;
if ( seen [ j ] ) break ;
}
sector _list [ k ] = ( { nodes : buf , data : _ _toBuffer ( [ buf _chain ] ) } /*:SectorEntry*/ ) ;
}
return sector _list ;
}
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
function read _directory ( dir _start /*:number*/ , sector _list /*:SectorList*/ , sectors /*:Array<RawBytes>*/ , Paths /*:Array<string>*/ , nmfs , files , FileIndex , mini ) {
var minifat _store = 0 , pl = ( Paths . length ? 2 : 0 ) ;
var sector = sector _list [ dir _start ] . data ;
var i = 0 , namelen = 0 , name ;
for ( ; i < sector . length ; i += 128 ) {
var blob /*:CFBlob*/ = /*::(*/ sector . slice ( i , i + 128 ) /*:: :any)*/ ;
prep _blob ( blob , 64 ) ;
namelen = blob . read _shift ( 2 ) ;
name = _ _utf16le ( blob , 0 , namelen - pl ) ;
Paths . push ( name ) ;
var o /*:CFBEntry*/ = ( {
name : name ,
type : blob . read _shift ( 1 ) ,
color : blob . read _shift ( 1 ) ,
L : blob . read _shift ( 4 , 'i' ) ,
R : blob . read _shift ( 4 , 'i' ) ,
C : blob . read _shift ( 4 , 'i' ) ,
clsid : blob . read _shift ( 16 ) ,
state : blob . read _shift ( 4 , 'i' ) ,
start : 0 ,
size : 0
} ) ;
var ctime /*:number*/ = blob . read _shift ( 2 ) + blob . read _shift ( 2 ) + blob . read _shift ( 2 ) + blob . read _shift ( 2 ) ;
if ( ctime !== 0 ) o . ct = read _date ( blob , blob . l - 8 ) ;
var mtime /*:number*/ = blob . read _shift ( 2 ) + blob . read _shift ( 2 ) + blob . read _shift ( 2 ) + blob . read _shift ( 2 ) ;
if ( mtime !== 0 ) o . mt = read _date ( blob , blob . l - 8 ) ;
o . start = blob . read _shift ( 4 , 'i' ) ;
o . size = blob . read _shift ( 4 , 'i' ) ;
if ( o . size < 0 && o . start < 0 ) { o . size = o . type = 0 ; o . start = ENDOFCHAIN ; o . name = "" ; }
if ( o . type === 5 ) { /* root */
minifat _store = o . start ;
if ( nmfs > 0 && minifat _store !== ENDOFCHAIN ) sector _list [ minifat _store ] . name = "!StreamData" ;
/*minifat_size = o.size;*/
} else if ( o . size >= 4096 /* MSCSZ */ ) {
o . storage = 'fat' ;
if ( sector _list [ o . start ] === undefined ) sector _list [ o . start ] = get _sector _list ( sectors , o . start , sector _list . fat _addrs , sector _list . ssz ) ;
sector _list [ o . start ] . name = o . name ;
o . content = ( sector _list [ o . start ] . data . slice ( 0 , o . size ) /*:any*/ ) ;
} else {
o . storage = 'minifat' ;
if ( o . size < 0 ) o . size = 0 ;
else if ( minifat _store !== ENDOFCHAIN && o . start !== ENDOFCHAIN && sector _list [ minifat _store ] ) {
o . content = get _mfat _entry ( o , sector _list [ minifat _store ] . data , ( sector _list [ mini ] || { } ) . data ) ;
}
}
if ( o . content ) prep _blob ( o . content , 0 ) ;
files [ name ] = o ;
FileIndex . push ( o ) ;
}
}
function read _date ( blob /*:RawBytes|CFBlob*/ , offset /*:number*/ ) /*:Date*/ {
return new Date ( ( ( ( _ _readUInt32LE ( blob , offset + 4 ) / 1e7 ) * Math . pow ( 2 , 32 ) + _ _readUInt32LE ( blob , offset ) / 1e7 ) - 11644473600 ) * 1000 ) ;
}
function read _file ( filename /*:string*/ , options /*:CFBReadOpts*/ ) {
get _fs ( ) ;
return parse ( fs . readFileSync ( filename ) , options ) ;
}
function read ( blob /*:RawBytes|string*/ , options /*:CFBReadOpts*/ ) {
switch ( options && options . type || "base64" ) {
case "file" : /*:: if(typeof blob !== 'string') throw "Must pass a filename when type='file'"; */ return read _file ( blob , options ) ;
case "base64" : /*:: if(typeof blob !== 'string') throw "Must pass a base64-encoded binary string when type='file'"; */ return parse ( s2a ( Base64 . decode ( blob ) ) , options ) ;
case "binary" : /*:: if(typeof blob !== 'string') throw "Must pass a binary string when type='file'"; */ return parse ( s2a ( blob ) , options ) ;
}
return parse ( /*::typeof blob == 'string' ? new Buffer(blob, 'utf-8') : */ blob , options ) ;
}
function init _cfb ( cfb /*:CFBContainer*/ , opts /*:?any*/ ) /*:void*/ {
var o = opts || { } , root = o . root || "Root Entry" ;
if ( ! cfb . FullPaths ) cfb . FullPaths = [ ] ;
if ( ! cfb . FileIndex ) cfb . FileIndex = [ ] ;
if ( cfb . FullPaths . length !== cfb . FileIndex . length ) throw new Error ( "inconsistent CFB structure" ) ;
if ( cfb . FullPaths . length === 0 ) {
cfb . FullPaths [ 0 ] = root + "/" ;
cfb . FileIndex [ 0 ] = ( { name : root , type : 5 } /*:any*/ ) ;
}
if ( o . CLSID ) cfb . FileIndex [ 0 ] . clsid = o . CLSID ;
seed _cfb ( cfb ) ;
}
function seed _cfb ( cfb /*:CFBContainer*/ ) /*:void*/ {
var nm = "\u0001Sh33tJ5" ;
if ( CFB . find ( cfb , "/" + nm ) ) return ;
var p = new _buf ( 4 ) ; p [ 0 ] = 55 ; p [ 1 ] = p [ 3 ] = 50 ; p [ 2 ] = 54 ;
cfb . FileIndex . push ( ( { name : nm , type : 2 , content : p , size : 4 , L : 69 , R : 69 , C : 69 } /*:any*/ ) ) ;
cfb . FullPaths . push ( cfb . FullPaths [ 0 ] + nm ) ;
rebuild _cfb ( cfb ) ;
}
function rebuild _cfb ( cfb /*:CFBContainer*/ , f /*:?boolean*/ ) /*:void*/ {
init _cfb ( cfb ) ;
var gc = false , s = false ;
for ( var i = cfb . FullPaths . length - 1 ; i >= 0 ; -- i ) {
var _file = cfb . FileIndex [ i ] ;
switch ( _file . type ) {
case 0 :
if ( s ) gc = true ;
else { cfb . FileIndex . pop ( ) ; cfb . FullPaths . pop ( ) ; }
break ;
case 1 : case 2 : case 5 :
s = true ;
if ( isNaN ( _file . R * _file . L * _file . C ) ) gc = true ;
if ( _file . R > - 1 && _file . L > - 1 && _file . R == _file . L ) gc = true ;
break ;
default : gc = true ; break ;
}
}
if ( ! gc && ! f ) return ;
var now = new Date ( 1987 , 1 , 19 ) , j = 0 ;
var data /*:Array<[string, CFBEntry]>*/ = [ ] ;
for ( i = 0 ; i < cfb . FullPaths . length ; ++ i ) {
if ( cfb . FileIndex [ i ] . type === 0 ) continue ;
data . push ( [ cfb . FullPaths [ i ] , cfb . FileIndex [ i ] ] ) ;
}
for ( i = 0 ; i < data . length ; ++ i ) {
var dad = dirname ( data [ i ] [ 0 ] ) ;
s = false ;
for ( j = 0 ; j < data . length ; ++ j ) if ( data [ j ] [ 0 ] === dad ) s = true ;
if ( ! s ) data . push ( [ dad , ( {
name : filename ( dad ) . replace ( "/" , "" ) ,
type : 1 ,
clsid : HEADER _CLSID ,
ct : now , mt : now ,
content : null
} /*:any*/ ) ] ) ;
}
data . sort ( function ( x , y ) { return namecmp ( x [ 0 ] , y [ 0 ] ) ; } ) ;
cfb . FullPaths = [ ] ; cfb . FileIndex = [ ] ;
for ( i = 0 ; i < data . length ; ++ i ) { cfb . FullPaths [ i ] = data [ i ] [ 0 ] ; cfb . FileIndex [ i ] = data [ i ] [ 1 ] ; }
for ( i = 0 ; i < data . length ; ++ i ) {
var elt = cfb . FileIndex [ i ] ;
var nm = cfb . FullPaths [ i ] ;
elt . name = filename ( nm ) . replace ( "/" , "" ) ;
elt . L = elt . R = elt . C = - ( elt . color = 1 ) ;
elt . size = elt . content ? elt . content . length : 0 ;
elt . start = 0 ;
elt . clsid = ( elt . clsid || HEADER _CLSID ) ;
if ( i === 0 ) {
elt . C = data . length > 1 ? 1 : - 1 ;
elt . size = 0 ;
elt . type = 5 ;
} else if ( nm . slice ( - 1 ) == "/" ) {
for ( j = i + 1 ; j < data . length ; ++ j ) if ( dirname ( cfb . FullPaths [ j ] ) == nm ) break ;
elt . C = j >= data . length ? - 1 : j ;
for ( j = i + 1 ; j < data . length ; ++ j ) if ( dirname ( cfb . FullPaths [ j ] ) == dirname ( nm ) ) break ;
elt . R = j >= data . length ? - 1 : j ;
elt . type = 1 ;
} else {
if ( dirname ( cfb . FullPaths [ i + 1 ] || "" ) == dirname ( nm ) ) elt . R = i + 1 ;
elt . type = 2 ;
}
}
}
function _write ( cfb /*:CFBContainer*/ , options /*:CFBWriteOpts*/ ) /*:RawBytes*/ {
var _opts = options || { } ;
rebuild _cfb ( cfb ) ;
if ( _opts . fileType == 'zip' ) return write _zip ( cfb , _opts ) ;
var L = ( function ( cfb /*:CFBContainer*/ ) /*:Array<number>*/ {
var mini _size = 0 , fat _size = 0 ;
for ( var i = 0 ; i < cfb . FileIndex . length ; ++ i ) {
var file = cfb . FileIndex [ i ] ;
if ( ! file . content ) continue ;
/*:: if(file.content == null) throw new Error("unreachable"); */
var flen = file . content . length ;
if ( flen > 0 ) {
if ( flen < 0x1000 ) mini _size += ( flen + 0x3F ) >> 6 ;
else fat _size += ( flen + 0x01FF ) >> 9 ;
}
}
var dir _cnt = ( cfb . FullPaths . length + 3 ) >> 2 ;
var mini _cnt = ( mini _size + 7 ) >> 3 ;
var mfat _cnt = ( mini _size + 0x7F ) >> 7 ;
var fat _base = mini _cnt + fat _size + dir _cnt + mfat _cnt ;
var fat _cnt = ( fat _base + 0x7F ) >> 7 ;
var difat _cnt = fat _cnt <= 109 ? 0 : Math . ceil ( ( fat _cnt - 109 ) / 0x7F ) ;
while ( ( ( fat _base + fat _cnt + difat _cnt + 0x7F ) >> 7 ) > fat _cnt ) difat _cnt = ++ fat _cnt <= 109 ? 0 : Math . ceil ( ( fat _cnt - 109 ) / 0x7F ) ;
var L = [ 1 , difat _cnt , fat _cnt , mfat _cnt , dir _cnt , fat _size , mini _size , 0 ] ;
cfb . FileIndex [ 0 ] . size = mini _size << 6 ;
L [ 7 ] = ( cfb . FileIndex [ 0 ] . start = L [ 0 ] + L [ 1 ] + L [ 2 ] + L [ 3 ] + L [ 4 ] + L [ 5 ] ) + ( ( L [ 6 ] + 7 ) >> 3 ) ;
return L ;
} ) ( cfb ) ;
var o = new _buf ( L [ 7 ] << 9 ) ;
var i = 0 , T = 0 ;
{
for ( i = 0 ; i < 8 ; ++ i ) o . write _shift ( 1 , HEADER _SIG [ i ] ) ;
for ( i = 0 ; i < 8 ; ++ i ) o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0x003E ) ;
o . write _shift ( 2 , 0x0003 ) ;
o . write _shift ( 2 , 0xFFFE ) ;
o . write _shift ( 2 , 0x0009 ) ;
o . write _shift ( 2 , 0x0006 ) ;
for ( i = 0 ; i < 3 ; ++ i ) o . write _shift ( 2 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , L [ 2 ] ) ;
o . write _shift ( 4 , L [ 0 ] + L [ 1 ] + L [ 2 ] + L [ 3 ] - 1 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 1 << 12 ) ;
o . write _shift ( 4 , L [ 3 ] ? L [ 0 ] + L [ 1 ] + L [ 2 ] - 1 : ENDOFCHAIN ) ;
o . write _shift ( 4 , L [ 3 ] ) ;
o . write _shift ( - 4 , L [ 1 ] ? L [ 0 ] - 1 : ENDOFCHAIN ) ;
o . write _shift ( 4 , L [ 1 ] ) ;
for ( i = 0 ; i < 109 ; ++ i ) o . write _shift ( - 4 , i < L [ 2 ] ? L [ 1 ] + i : - 1 ) ;
}
if ( L [ 1 ] ) {
for ( T = 0 ; T < L [ 1 ] ; ++ T ) {
for ( ; i < 236 + T * 127 ; ++ i ) o . write _shift ( - 4 , i < L [ 2 ] ? L [ 1 ] + i : - 1 ) ;
o . write _shift ( - 4 , T === L [ 1 ] - 1 ? ENDOFCHAIN : T + 1 ) ;
}
}
var chainit = function ( w /*:number*/ ) /*:void*/ {
for ( T += w ; i < T - 1 ; ++ i ) o . write _shift ( - 4 , i + 1 ) ;
if ( w ) { ++ i ; o . write _shift ( - 4 , ENDOFCHAIN ) ; }
} ;
T = i = 0 ;
for ( T += L [ 1 ] ; i < T ; ++ i ) o . write _shift ( - 4 , consts . DIFSECT ) ;
for ( T += L [ 2 ] ; i < T ; ++ i ) o . write _shift ( - 4 , consts . FATSECT ) ;
chainit ( L [ 3 ] ) ;
chainit ( L [ 4 ] ) ;
var j /*:number*/ = 0 , flen /*:number*/ = 0 ;
var file /*:CFBEntry*/ = cfb . FileIndex [ 0 ] ;
for ( ; j < cfb . FileIndex . length ; ++ j ) {
file = cfb . FileIndex [ j ] ;
if ( ! file . content ) continue ;
/*:: if(file.content == null) throw new Error("unreachable"); */
flen = file . content . length ;
if ( flen < 0x1000 ) continue ;
file . start = T ;
chainit ( ( flen + 0x01FF ) >> 9 ) ;
}
chainit ( ( L [ 6 ] + 7 ) >> 3 ) ;
while ( o . l & 0x1FF ) o . write _shift ( - 4 , consts . ENDOFCHAIN ) ;
T = i = 0 ;
for ( j = 0 ; j < cfb . FileIndex . length ; ++ j ) {
file = cfb . FileIndex [ j ] ;
if ( ! file . content ) continue ;
/*:: if(file.content == null) throw new Error("unreachable"); */
flen = file . content . length ;
if ( ! flen || flen >= 0x1000 ) continue ;
file . start = T ;
chainit ( ( flen + 0x3F ) >> 6 ) ;
}
while ( o . l & 0x1FF ) o . write _shift ( - 4 , consts . ENDOFCHAIN ) ;
for ( i = 0 ; i < L [ 4 ] << 2 ; ++ i ) {
var nm = cfb . FullPaths [ i ] ;
if ( ! nm || nm . length === 0 ) {
for ( j = 0 ; j < 17 ; ++ j ) o . write _shift ( 4 , 0 ) ;
for ( j = 0 ; j < 3 ; ++ j ) o . write _shift ( 4 , - 1 ) ;
for ( j = 0 ; j < 12 ; ++ j ) o . write _shift ( 4 , 0 ) ;
continue ;
}
file = cfb . FileIndex [ i ] ;
if ( i === 0 ) file . start = file . size ? file . start - 1 : ENDOFCHAIN ;
var _nm /*:string*/ = ( i === 0 && _opts . root ) || file . name ;
flen = 2 * ( _nm . length + 1 ) ;
o . write _shift ( 64 , _nm , "utf16le" ) ;
o . write _shift ( 2 , flen ) ;
o . write _shift ( 1 , file . type ) ;
o . write _shift ( 1 , file . color ) ;
o . write _shift ( - 4 , file . L ) ;
o . write _shift ( - 4 , file . R ) ;
o . write _shift ( - 4 , file . C ) ;
if ( ! file . clsid ) for ( j = 0 ; j < 4 ; ++ j ) o . write _shift ( 4 , 0 ) ;
else o . write _shift ( 16 , file . clsid , "hex" ) ;
o . write _shift ( 4 , file . state || 0 ) ;
o . write _shift ( 4 , 0 ) ; o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , 0 ) ; o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , file . start ) ;
o . write _shift ( 4 , file . size ) ; o . write _shift ( 4 , 0 ) ;
}
for ( i = 1 ; i < cfb . FileIndex . length ; ++ i ) {
file = cfb . FileIndex [ i ] ;
/*:: if(!file.content) throw new Error("unreachable"); */
if ( file . size >= 0x1000 ) {
o . l = ( file . start + 1 ) << 9 ;
for ( j = 0 ; j < file . size ; ++ j ) o . write _shift ( 1 , file . content [ j ] ) ;
for ( ; j & 0x1FF ; ++ j ) o . write _shift ( 1 , 0 ) ;
}
}
for ( i = 1 ; i < cfb . FileIndex . length ; ++ i ) {
file = cfb . FileIndex [ i ] ;
/*:: if(!file.content) throw new Error("unreachable"); */
if ( file . size > 0 && file . size < 0x1000 ) {
for ( j = 0 ; j < file . size ; ++ j ) o . write _shift ( 1 , file . content [ j ] ) ;
for ( ; j & 0x3F ; ++ j ) o . write _shift ( 1 , 0 ) ;
}
}
while ( o . l < o . length ) o . write _shift ( 1 , 0 ) ;
return o ;
}
/* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */
function find ( cfb /*:CFBContainer*/ , path /*:string*/ ) /*:?CFBEntry*/ {
var UCFullPaths /*:Array<string>*/ = cfb . FullPaths . map ( function ( x ) { return x . toUpperCase ( ) ; } ) ;
var UCPaths /*:Array<string>*/ = UCFullPaths . map ( function ( x ) { var y = x . split ( "/" ) ; return y [ y . length - ( x . slice ( - 1 ) == "/" ? 2 : 1 ) ] ; } ) ;
var k /*:boolean*/ = false ;
if ( path . charCodeAt ( 0 ) === 47 /* "/" */ ) { k = true ; path = UCFullPaths [ 0 ] . slice ( 0 , - 1 ) + path ; }
else k = path . indexOf ( "/" ) !== - 1 ;
var UCPath /*:string*/ = path . toUpperCase ( ) ;
var w /*:number*/ = k === true ? UCFullPaths . indexOf ( UCPath ) : UCPaths . indexOf ( UCPath ) ;
if ( w !== - 1 ) return cfb . FileIndex [ w ] ;
var m = ! UCPath . match ( chr1 ) ;
UCPath = UCPath . replace ( chr0 , '' ) ;
if ( m ) UCPath = UCPath . replace ( chr1 , '!' ) ;
for ( w = 0 ; w < UCFullPaths . length ; ++ w ) {
if ( ( m ? UCFullPaths [ w ] . replace ( chr1 , '!' ) : UCFullPaths [ w ] ) . replace ( chr0 , '' ) == UCPath ) return cfb . FileIndex [ w ] ;
if ( ( m ? UCPaths [ w ] . replace ( chr1 , '!' ) : UCPaths [ w ] ) . replace ( chr0 , '' ) == UCPath ) return cfb . FileIndex [ w ] ;
}
return null ;
}
/** CFB Constants */
var MSSZ = 64 ; /* Mini Sector Size = 1<<6 */
//var MSCSZ = 4096; /* Mini Stream Cutoff Size */
/* 2.1 Compound File Sector Numbers and Types */
var ENDOFCHAIN = - 2 ;
/* 2.2 Compound File Header */
var HEADER _SIGNATURE = 'd0cf11e0a1b11ae1' ;
var HEADER _SIG = [ 0xD0 , 0xCF , 0x11 , 0xE0 , 0xA1 , 0xB1 , 0x1A , 0xE1 ] ;
var HEADER _CLSID = '00000000000000000000000000000000' ;
var consts = {
/* 2.1 Compund File Sector Numbers and Types */
MAXREGSECT : - 6 ,
DIFSECT : - 4 ,
FATSECT : - 3 ,
ENDOFCHAIN : ENDOFCHAIN ,
FREESECT : - 1 ,
/* 2.2 Compound File Header */
HEADER _SIGNATURE : HEADER _SIGNATURE ,
HEADER _MINOR _VERSION : '3e00' ,
MAXREGSID : - 6 ,
NOSTREAM : - 1 ,
HEADER _CLSID : HEADER _CLSID ,
/* 2.6.1 Compound File Directory Entry */
EntryTypes : [ 'unknown' , 'storage' , 'stream' , 'lockbytes' , 'property' , 'root' ]
} ;
function write _file ( cfb /*:CFBContainer*/ , filename /*:string*/ , options /*:CFBWriteOpts*/ ) /*:void*/ {
get _fs ( ) ;
var o = _write ( cfb , options ) ;
/*:: if(typeof Buffer == 'undefined' || !Buffer.isBuffer(o) || !(o instanceof Buffer)) throw new Error("unreachable"); */
fs . writeFileSync ( filename , o ) ;
}
function a2s ( o /*:RawBytes*/ ) /*:string*/ {
var out = new Array ( o . length ) ;
for ( var i = 0 ; i < o . length ; ++ i ) out [ i ] = String . fromCharCode ( o [ i ] ) ;
return out . join ( "" ) ;
}
function write ( cfb /*:CFBContainer*/ , options /*:CFBWriteOpts*/ ) /*:RawBytes|string*/ {
var o = _write ( cfb , options ) ;
switch ( options && options . type ) {
case "file" : get _fs ( ) ; fs . writeFileSync ( options . filename , ( o /*:any*/ ) ) ; return o ;
case "binary" : return a2s ( o ) ;
case "base64" : return Base64 . encode ( a2s ( o ) ) ;
}
return o ;
}
/* node < 8.1 zlib does not expose bytesRead, so default to pure JS */
var _zlib ;
function use _zlib ( zlib ) { try {
var InflateRaw = zlib . InflateRaw ;
var InflRaw = new InflateRaw ( ) ;
InflRaw . _processChunk ( new Uint8Array ( [ 3 , 0 ] ) , InflRaw . _finishFlushFlag ) ;
if ( InflRaw . bytesRead ) _zlib = zlib ;
else throw new Error ( "zlib does not expose bytesRead" ) ;
} catch ( e ) { console . error ( "cannot use native zlib: " + ( e . message || e ) ) ; } }
function _inflateRawSync ( payload , usz ) {
if ( ! _zlib ) return _inflate ( payload , usz ) ;
var InflateRaw = _zlib . InflateRaw ;
var InflRaw = new InflateRaw ( ) ;
var out = InflRaw . _processChunk ( payload . slice ( payload . l ) , InflRaw . _finishFlushFlag ) ;
payload . l += InflRaw . bytesRead ;
return out ;
}
function _deflateRawSync ( payload ) {
return _zlib ? _zlib . deflateRawSync ( payload ) : _deflate ( payload ) ;
}
var CLEN _ORDER = [ 16 , 17 , 18 , 0 , 8 , 7 , 9 , 6 , 10 , 5 , 11 , 4 , 12 , 3 , 13 , 2 , 14 , 1 , 15 ] ;
/* LEN_ID = [ 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285 ]; */
var LEN _LN = [ 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 13 , 15 , 17 , 19 , 23 , 27 , 31 , 35 , 43 , 51 , 59 , 67 , 83 , 99 , 115 , 131 , 163 , 195 , 227 , 258 ] ;
/* DST_ID = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ]; */
var DST _LN = [ 1 , 2 , 3 , 4 , 5 , 7 , 9 , 13 , 17 , 25 , 33 , 49 , 65 , 97 , 129 , 193 , 257 , 385 , 513 , 769 , 1025 , 1537 , 2049 , 3073 , 4097 , 6145 , 8193 , 12289 , 16385 , 24577 ] ;
function bit _swap _8 ( n ) { var t = ( ( ( ( ( n << 1 ) | ( n << 11 ) ) & 0x22110 ) | ( ( ( n << 5 ) | ( n << 15 ) ) & 0x88440 ) ) ) ; return ( ( t >> 16 ) | ( t >> 8 ) | t ) & 0xFF ; }
var use _typed _arrays = typeof Uint8Array !== 'undefined' ;
var bitswap8 = use _typed _arrays ? new Uint8Array ( 1 << 8 ) : [ ] ;
for ( var q = 0 ; q < ( 1 << 8 ) ; ++ q ) bitswap8 [ q ] = bit _swap _8 ( q ) ;
function bit _swap _n ( n , b ) {
var rev = bitswap8 [ n & 0xFF ] ;
if ( b <= 8 ) return rev >>> ( 8 - b ) ;
rev = ( rev << 8 ) | bitswap8 [ ( n >> 8 ) & 0xFF ] ;
if ( b <= 16 ) return rev >>> ( 16 - b ) ;
rev = ( rev << 8 ) | bitswap8 [ ( n >> 16 ) & 0xFF ] ;
return rev >>> ( 24 - b ) ;
}
/* helpers for unaligned bit reads */
function read _bits _2 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 6 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x03 ; }
function read _bits _3 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 5 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x07 ; }
function read _bits _4 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 4 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x0F ; }
function read _bits _5 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 3 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x1F ; }
function read _bits _7 ( buf , bl ) { var w = ( bl & 7 ) , h = ( bl >>> 3 ) ; return ( ( buf [ h ] | ( w <= 1 ? 0 : buf [ h + 1 ] << 8 ) ) >>> w ) & 0x7F ; }
/* works up to n = 3 * 8 + 1 = 25 */
function read _bits _n ( buf , bl , n ) {
var w = ( bl & 7 ) , h = ( bl >>> 3 ) , f = ( ( 1 << n ) - 1 ) ;
var v = buf [ h ] >>> w ;
if ( n < 8 - w ) return v & f ;
v |= buf [ h + 1 ] << ( 8 - w ) ;
if ( n < 16 - w ) return v & f ;
v |= buf [ h + 2 ] << ( 16 - w ) ;
if ( n < 24 - w ) return v & f ;
v |= buf [ h + 3 ] << ( 24 - w ) ;
return v & f ;
}
/* until ArrayBuffer#realloc is a thing, fake a realloc */
function realloc ( b , sz /*:number*/ ) {
var L = b . length , M = 2 * L > sz ? 2 * L : sz + 5 , i = 0 ;
if ( L >= sz ) return b ;
if ( has _buf ) {
var o = new _unsafe _buf ( M ) ;
// $FlowIgnore
if ( b . copy ) b . copy ( o ) ;
else for ( ; i < b . length ; ++ i ) o [ i ] = b [ i ] ;
return o ;
} else if ( use _typed _arrays ) {
var a = new Uint8Array ( M ) ;
if ( a . set ) a . set ( b ) ;
else for ( ; i < b . length ; ++ i ) a [ i ] = b [ i ] ;
return a ;
}
b . length = M ;
return b ;
}
/* zero-filled arrays for older browsers */
function zero _fill _array ( n ) {
var o = new Array ( n ) ;
for ( var i = 0 ; i < n ; ++ i ) o [ i ] = 0 ;
return o ;
} var _deflate = ( function ( ) {
var _deflateRaw = ( function ( ) {
return function deflateRaw ( data , out ) {
var boff = 0 ;
while ( boff < data . length ) {
var L = Math . min ( 0xFFFF , data . length - boff ) ;
var h = boff + L == data . length ;
/* TODO: this is only type 0 stored */
out . write _shift ( 1 , + h ) ;
out . write _shift ( 2 , L ) ;
out . write _shift ( 2 , ( ~ L ) & 0xFFFF ) ;
while ( L -- > 0 ) out [ out . l ++ ] = data [ boff ++ ] ;
}
return out . l ;
} ;
} ) ( ) ;
return function ( data ) {
var buf = new _buf ( 50 + Math . floor ( data . length * 1.1 ) ) ;
var off = _deflateRaw ( data , buf ) ;
return buf . slice ( 0 , off ) ;
} ;
} ) ( ) ;
/* modified inflate function also moves original read head */
/* build tree (used for literals and lengths) */
function build _tree ( clens , cmap , MAX /*:number*/ ) /*:number*/ {
var maxlen = 1 , w = 0 , i = 0 , j = 0 , ccode = 0 , L = clens . length ;
var bl _count = use _typed _arrays ? new Uint16Array ( 32 ) : zero _fill _array ( 32 ) ;
for ( i = 0 ; i < 32 ; ++ i ) bl _count [ i ] = 0 ;
for ( i = L ; i < MAX ; ++ i ) clens [ i ] = 0 ;
L = clens . length ;
var ctree = use _typed _arrays ? new Uint16Array ( L ) : zero _fill _array ( L ) ; // []
/* build code tree */
for ( i = 0 ; i < L ; ++ i ) {
bl _count [ ( w = clens [ i ] ) ] ++ ;
if ( maxlen < w ) maxlen = w ;
ctree [ i ] = 0 ;
}
bl _count [ 0 ] = 0 ;
for ( i = 1 ; i <= maxlen ; ++ i ) bl _count [ i + 16 ] = ( ccode = ( ccode + bl _count [ i - 1 ] ) << 1 ) ;
for ( i = 0 ; i < L ; ++ i ) {
ccode = clens [ i ] ;
if ( ccode != 0 ) ctree [ i ] = bl _count [ ccode + 16 ] ++ ;
}
/* cmap[maxlen + 4 bits] = (off&15) + (lit<<4) reverse mapping */
var cleni = 0 ;
for ( i = 0 ; i < L ; ++ i ) {
cleni = clens [ i ] ;
if ( cleni != 0 ) {
ccode = bit _swap _n ( ctree [ i ] , maxlen ) >> ( maxlen - cleni ) ;
for ( j = ( 1 << ( maxlen + 4 - cleni ) ) - 1 ; j >= 0 ; -- j )
cmap [ ccode | ( j << cleni ) ] = ( cleni & 15 ) | ( i << 4 ) ;
}
}
return maxlen ;
}
var fix _lmap = use _typed _arrays ? new Uint16Array ( 512 ) : zero _fill _array ( 512 ) ;
var fix _dmap = use _typed _arrays ? new Uint16Array ( 32 ) : zero _fill _array ( 32 ) ;
if ( ! use _typed _arrays ) {
for ( var i = 0 ; i < 512 ; ++ i ) fix _lmap [ i ] = 0 ;
for ( i = 0 ; i < 32 ; ++ i ) fix _dmap [ i ] = 0 ;
}
( function ( ) {
var dlens /*:Array<number>*/ = [ ] ;
var i = 0 ;
for ( ; i < 32 ; i ++ ) dlens . push ( 5 ) ;
build _tree ( dlens , fix _dmap , 32 ) ;
var clens /*:Array<number>*/ = [ ] ;
i = 0 ;
for ( ; i <= 143 ; i ++ ) clens . push ( 8 ) ;
for ( ; i <= 255 ; i ++ ) clens . push ( 9 ) ;
for ( ; i <= 279 ; i ++ ) clens . push ( 7 ) ;
for ( ; i <= 287 ; i ++ ) clens . push ( 8 ) ;
build _tree ( clens , fix _lmap , 288 ) ;
} ) ( ) ;
var dyn _lmap = use _typed _arrays ? new Uint16Array ( 32768 ) : zero _fill _array ( 32768 ) ;
var dyn _dmap = use _typed _arrays ? new Uint16Array ( 32768 ) : zero _fill _array ( 32768 ) ;
var dyn _cmap = use _typed _arrays ? new Uint16Array ( 128 ) : zero _fill _array ( 128 ) ;
var dyn _len _1 = 1 , dyn _len _2 = 1 ;
/* 5.5.3 Expanding Huffman Codes */
function dyn ( data , boff /*:number*/ ) {
/* nomenclature from RFC1951 refers to bit values; these are offset by the implicit constant */
var _HLIT = read _bits _5 ( data , boff ) + 257 ; boff += 5 ;
var _HDIST = read _bits _5 ( data , boff ) + 1 ; boff += 5 ;
var _HCLEN = read _bits _4 ( data , boff ) + 4 ; boff += 4 ;
var w = 0 ;
/* grab and store code lengths */
var clens = use _typed _arrays ? new Uint8Array ( 19 ) : zero _fill _array ( 19 ) ;
var ctree = [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ;
var maxlen = 1 ;
var bl _count = use _typed _arrays ? new Uint8Array ( 8 ) : zero _fill _array ( 8 ) ;
var next _code = use _typed _arrays ? new Uint8Array ( 8 ) : zero _fill _array ( 8 ) ;
var L = clens . length ; /* 19 */
for ( var i = 0 ; i < _HCLEN ; ++ i ) {
clens [ CLEN _ORDER [ i ] ] = w = read _bits _3 ( data , boff ) ;
if ( maxlen < w ) maxlen = w ;
bl _count [ w ] ++ ;
boff += 3 ;
}
/* build code tree */
var ccode = 0 ;
bl _count [ 0 ] = 0 ;
for ( i = 1 ; i <= maxlen ; ++ i ) next _code [ i ] = ccode = ( ccode + bl _count [ i - 1 ] ) << 1 ;
for ( i = 0 ; i < L ; ++ i ) if ( ( ccode = clens [ i ] ) != 0 ) ctree [ i ] = next _code [ ccode ] ++ ;
/* cmap[7 bits from stream] = (off&7) + (lit<<3) */
var cleni = 0 ;
for ( i = 0 ; i < L ; ++ i ) {
cleni = clens [ i ] ;
if ( cleni != 0 ) {
ccode = bitswap8 [ ctree [ i ] ] >> ( 8 - cleni ) ;
for ( var j = ( 1 << ( 7 - cleni ) ) - 1 ; j >= 0 ; -- j ) dyn _cmap [ ccode | ( j << cleni ) ] = ( cleni & 7 ) | ( i << 3 ) ;
}
}
/* read literal and dist codes at once */
var hcodes /*:Array<number>*/ = [ ] ;
maxlen = 1 ;
for ( ; hcodes . length < _HLIT + _HDIST ; ) {
ccode = dyn _cmap [ read _bits _7 ( data , boff ) ] ;
boff += ccode & 7 ;
switch ( ( ccode >>>= 3 ) ) {
case 16 :
w = 3 + read _bits _2 ( data , boff ) ; boff += 2 ;
ccode = hcodes [ hcodes . length - 1 ] ;
while ( w -- > 0 ) hcodes . push ( ccode ) ;
break ;
case 17 :
w = 3 + read _bits _3 ( data , boff ) ; boff += 3 ;
while ( w -- > 0 ) hcodes . push ( 0 ) ;
break ;
case 18 :
w = 11 + read _bits _7 ( data , boff ) ; boff += 7 ;
while ( w -- > 0 ) hcodes . push ( 0 ) ;
break ;
default :
hcodes . push ( ccode ) ;
if ( maxlen < ccode ) maxlen = ccode ;
break ;
}
}
/* build literal / length trees */
var h1 = hcodes . slice ( 0 , _HLIT ) , h2 = hcodes . slice ( _HLIT ) ;
for ( i = _HLIT ; i < 286 ; ++ i ) h1 [ i ] = 0 ;
for ( i = _HDIST ; i < 30 ; ++ i ) h2 [ i ] = 0 ;
dyn _len _1 = build _tree ( h1 , dyn _lmap , 286 ) ;
dyn _len _2 = build _tree ( h2 , dyn _dmap , 30 ) ;
return boff ;
}
/* return [ data, bytesRead ] */
function inflate ( data , usz /*:number*/ ) {
/* shortcircuit for empty buffer [0x03, 0x00] */
if ( data [ 0 ] == 3 && ! ( data [ 1 ] & 0x3 ) ) { return [ new _raw _buf ( usz ) , 2 ] ; }
/* bit offset */
var boff = 0 ;
/* header includes final bit and type bits */
var header = 0 ;
var outbuf = new _unsafe _buf ( usz ? usz : ( 1 << 18 ) ) ;
var woff = 0 ;
var OL = outbuf . length >>> 0 ;
var max _len _1 = 0 , max _len _2 = 0 ;
while ( ( header & 1 ) == 0 ) {
header = read _bits _3 ( data , boff ) ; boff += 3 ;
if ( ( header >>> 1 ) == 0 ) {
/* Stored block */
if ( boff & 7 ) boff += 8 - ( boff & 7 ) ;
/* 2 bytes sz, 2 bytes bit inverse */
var sz = data [ boff >>> 3 ] | data [ ( boff >>> 3 ) + 1 ] << 8 ;
boff += 32 ;
/* push sz bytes */
if ( ! usz && OL < woff + sz ) { outbuf = realloc ( outbuf , woff + sz ) ; OL = outbuf . length ; }
if ( typeof data . copy === 'function' ) {
// $FlowIgnore
data . copy ( outbuf , woff , boff >>> 3 , ( boff >>> 3 ) + sz ) ;
woff += sz ; boff += 8 * sz ;
} else while ( sz -- > 0 ) { outbuf [ woff ++ ] = data [ boff >>> 3 ] ; boff += 8 ; }
continue ;
} else if ( ( header >>> 1 ) == 1 ) {
/* Fixed Huffman */
max _len _1 = 9 ; max _len _2 = 5 ;
} else {
/* Dynamic Huffman */
boff = dyn ( data , boff ) ;
max _len _1 = dyn _len _1 ; max _len _2 = dyn _len _2 ;
}
if ( ! usz && ( OL < woff + 32767 ) ) { outbuf = realloc ( outbuf , woff + 32767 ) ; OL = outbuf . length ; }
for ( ; ; ) { // while(true) is apparently out of vogue in modern JS circles
/* ingest code and move read head */
var bits = read _bits _n ( data , boff , max _len _1 ) ;
var code = ( header >>> 1 ) == 1 ? fix _lmap [ bits ] : dyn _lmap [ bits ] ;
boff += code & 15 ; code >>>= 4 ;
/* 0-255 are literals, 256 is end of block token, 257+ are copy tokens */
if ( ( ( code >>> 8 ) & 0xFF ) === 0 ) outbuf [ woff ++ ] = code ;
else if ( code == 256 ) break ;
else {
code -= 257 ;
var len _eb = ( code < 8 ) ? 0 : ( ( code - 4 ) >> 2 ) ; if ( len _eb > 5 ) len _eb = 0 ;
var tgt = woff + LEN _LN [ code ] ;
/* length extra bits */
if ( len _eb > 0 ) {
tgt += read _bits _n ( data , boff , len _eb ) ;
boff += len _eb ;
}
/* dist code */
bits = read _bits _n ( data , boff , max _len _2 ) ;
code = ( header >>> 1 ) == 1 ? fix _dmap [ bits ] : dyn _dmap [ bits ] ;
boff += code & 15 ; code >>>= 4 ;
var dst _eb = ( code < 4 ? 0 : ( code - 2 ) >> 1 ) ;
var dst = DST _LN [ code ] ;
/* dist extra bits */
if ( dst _eb > 0 ) {
dst += read _bits _n ( data , boff , dst _eb ) ;
boff += dst _eb ;
}
/* in the common case, manual byte copy is faster than TA set / Buffer copy */
if ( ! usz && OL < tgt ) { outbuf = realloc ( outbuf , tgt ) ; OL = outbuf . length ; }
while ( woff < tgt ) { outbuf [ woff ] = outbuf [ woff - dst ] ; ++ woff ; }
}
}
}
return [ usz ? outbuf : outbuf . slice ( 0 , woff ) , ( boff + 7 ) >>> 3 ] ;
}
function _inflate ( payload , usz ) {
var data = payload . slice ( payload . l || 0 ) ;
var out = inflate ( data , usz ) ;
payload . l += out [ 1 ] ;
return out [ 0 ] ;
}
function warn _or _throw ( wrn , msg ) {
if ( wrn ) { if ( typeof console !== 'undefined' ) console . error ( msg ) ; }
else throw new Error ( msg ) ;
}
function parse _zip ( file /*:RawBytes*/ , options /*:CFBReadOpts*/ ) /*:CFBContainer*/ {
var blob /*:CFBlob*/ = /*::(*/ file /*:: :any)*/ ;
prep _blob ( blob , 0 ) ;
var FileIndex /*:CFBFileIndex*/ = [ ] , FullPaths /*:Array<string>*/ = [ ] ;
var o = {
FileIndex : FileIndex ,
FullPaths : FullPaths
} ;
init _cfb ( o , { root : options . root } ) ;
/* find end of central directory, start just after signature */
var i = blob . length - 4 ;
while ( ( blob [ i ] != 0x50 || blob [ i + 1 ] != 0x4b || blob [ i + 2 ] != 0x05 || blob [ i + 3 ] != 0x06 ) && i >= 0 ) -- i ;
blob . l = i + 4 ;
/* parse end of central directory */
blob . l += 4 ;
var fcnt = blob . read _shift ( 2 ) ;
blob . l += 6 ;
var start _cd = blob . read _shift ( 4 ) ;
/* parse central directory */
blob . l = start _cd ;
for ( i = 0 ; i < fcnt ; ++ i ) {
/* trust local file header instead of CD entry */
blob . l += 20 ;
var csz = blob . read _shift ( 4 ) ;
var usz = blob . read _shift ( 4 ) ;
var namelen = blob . read _shift ( 2 ) ;
var efsz = blob . read _shift ( 2 ) ;
var fcsz = blob . read _shift ( 2 ) ;
blob . l += 8 ;
var offset = blob . read _shift ( 4 ) ;
var EF = parse _extra _field ( /*::(*/ blob . slice ( blob . l + namelen , blob . l + namelen + efsz ) /*:: :any)*/ ) ;
blob . l += namelen + efsz + fcsz ;
var L = blob . l ;
blob . l = offset + 4 ;
parse _local _file ( blob , csz , usz , o , EF ) ;
blob . l = L ;
}
return o ;
}
/* head starts just after local file header signature */
function parse _local _file ( blob /*:CFBlob*/ , csz /*:number*/ , usz /*:number*/ , o /*:CFBContainer*/ , EF ) {
/* [local file header] */
blob . l += 2 ;
var flags = blob . read _shift ( 2 ) ;
var meth = blob . read _shift ( 2 ) ;
var date = parse _dos _date ( blob ) ;
if ( flags & 0x2041 ) throw new Error ( "Unsupported ZIP encryption" ) ;
var crc32 = blob . read _shift ( 4 ) ;
var _csz = blob . read _shift ( 4 ) ;
var _usz = blob . read _shift ( 4 ) ;
var namelen = blob . read _shift ( 2 ) ;
var efsz = blob . read _shift ( 2 ) ;
// TODO: flags & (1<<11) // UTF8
var name = "" ; for ( var i = 0 ; i < namelen ; ++ i ) name += String . fromCharCode ( blob [ blob . l ++ ] ) ;
if ( efsz ) {
var ef = parse _extra _field ( /*::(*/ blob . slice ( blob . l , blob . l + efsz ) /*:: :any)*/ ) ;
if ( ( ef [ 0x5455 ] || { } ) . mt ) date = ef [ 0x5455 ] . mt ;
if ( ( ( EF || { } ) [ 0x5455 ] || { } ) . mt ) date = EF [ 0x5455 ] . mt ;
}
blob . l += efsz ;
/* [encryption header] */
/* [file data] */
var data = blob . slice ( blob . l , blob . l + _csz ) ;
switch ( meth ) {
case 8 : data = _inflateRawSync ( blob , _usz ) ; break ;
case 0 : break ;
default : throw new Error ( "Unsupported ZIP Compression method " + meth ) ;
}
/* [data descriptor] */
var wrn = false ;
if ( flags & 8 ) {
crc32 = blob . read _shift ( 4 ) ;
if ( crc32 == 0x08074b50 ) { crc32 = blob . read _shift ( 4 ) ; wrn = true ; }
_csz = blob . read _shift ( 4 ) ;
_usz = blob . read _shift ( 4 ) ;
}
if ( _csz != csz ) warn _or _throw ( wrn , "Bad compressed size: " + csz + " != " + _csz ) ;
if ( _usz != usz ) warn _or _throw ( wrn , "Bad uncompressed size: " + usz + " != " + _usz ) ;
var _crc32 = CRC32 . buf ( data , 0 ) ;
if ( ( crc32 >> 0 ) != ( _crc32 >> 0 ) ) warn _or _throw ( wrn , "Bad CRC32 checksum: " + crc32 + " != " + _crc32 ) ;
cfb _add ( o , name , data , { unsafe : true , mt : date } ) ;
}
function write _zip ( cfb /*:CFBContainer*/ , options /*:CFBWriteOpts*/ ) /*:RawBytes*/ {
var _opts = options || { } ;
var out = [ ] , cdirs = [ ] ;
var o /*:CFBlob*/ = new _buf ( 1 ) ;
var method = ( _opts . compression ? 8 : 0 ) , flags = 0 ;
var desc = false ;
if ( desc ) flags |= 8 ;
var i = 0 , j = 0 ;
var start _cd = 0 , fcnt = 0 ;
var root = cfb . FullPaths [ 0 ] , fp = root , fi = cfb . FileIndex [ 0 ] ;
var crcs = [ ] ;
var sz _cd = 0 ;
for ( i = 1 ; i < cfb . FullPaths . length ; ++ i ) {
fp = cfb . FullPaths [ i ] . slice ( root . length ) ; fi = cfb . FileIndex [ i ] ;
if ( ! fi . size || ! fi . content || fp == "\u0001Sh33tJ5" ) continue ;
var start = start _cd ;
/* TODO: CP437 filename */
var namebuf = new _buf ( fp . length ) ;
for ( j = 0 ; j < fp . length ; ++ j ) namebuf . write _shift ( 1 , fp . charCodeAt ( j ) & 0x7F ) ;
namebuf = namebuf . slice ( 0 , namebuf . l ) ;
crcs [ fcnt ] = CRC32 . buf ( /*::((*/ fi . content /*::||[]):any)*/ , 0 ) ;
var outbuf = fi . content /*::||[]*/ ;
if ( method == 8 ) outbuf = _deflateRawSync ( outbuf ) ;
/* local file header */
o = new _buf ( 30 ) ;
o . write _shift ( 4 , 0x04034b50 ) ;
o . write _shift ( 2 , 20 ) ;
o . write _shift ( 2 , flags ) ;
o . write _shift ( 2 , method ) ;
/* TODO: last mod file time/date */
if ( fi . mt ) write _dos _date ( o , fi . mt ) ;
else o . write _shift ( 4 , 0 ) ;
o . write _shift ( - 4 , ( flags & 8 ) ? 0 : crcs [ fcnt ] ) ;
o . write _shift ( 4 , ( flags & 8 ) ? 0 : outbuf . length ) ;
o . write _shift ( 4 , ( flags & 8 ) ? 0 : /*::(*/ fi . content /*::||[])*/ . length ) ;
o . write _shift ( 2 , namebuf . length ) ;
o . write _shift ( 2 , 0 ) ;
start _cd += o . length ;
out . push ( o ) ;
start _cd += namebuf . length ;
out . push ( namebuf ) ;
/* TODO: encryption header ? */
start _cd += outbuf . length ;
out . push ( outbuf ) ;
/* data descriptor */
if ( flags & 8 ) {
o = new _buf ( 12 ) ;
o . write _shift ( - 4 , crcs [ fcnt ] ) ;
o . write _shift ( 4 , outbuf . length ) ;
o . write _shift ( 4 , /*::(*/ fi . content /*::||[])*/ . length ) ;
start _cd += o . l ;
out . push ( o ) ;
}
/* central directory */
o = new _buf ( 46 ) ;
o . write _shift ( 4 , 0x02014b50 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 20 ) ;
o . write _shift ( 2 , flags ) ;
o . write _shift ( 2 , method ) ;
o . write _shift ( 4 , 0 ) ; /* TODO: last mod file time/date */
o . write _shift ( - 4 , crcs [ fcnt ] ) ;
o . write _shift ( 4 , outbuf . length ) ;
o . write _shift ( 4 , /*::(*/ fi . content /*::||[])*/ . length ) ;
o . write _shift ( 2 , namebuf . length ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 4 , 0 ) ;
o . write _shift ( 4 , start ) ;
sz _cd += o . l ;
cdirs . push ( o ) ;
sz _cd += namebuf . length ;
cdirs . push ( namebuf ) ;
++ fcnt ;
}
/* end of central directory */
o = new _buf ( 22 ) ;
o . write _shift ( 4 , 0x06054b50 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 2 , fcnt ) ;
o . write _shift ( 2 , fcnt ) ;
o . write _shift ( 4 , sz _cd ) ;
o . write _shift ( 4 , start _cd ) ;
o . write _shift ( 2 , 0 ) ;
return bconcat ( ( [ bconcat ( ( out /*:any*/ ) ) , bconcat ( cdirs ) , o ] /*:any*/ ) ) ;
}
function cfb _new ( opts /*:?any*/ ) /*:CFBContainer*/ {
var o /*:CFBContainer*/ = ( { } /*:any*/ ) ;
init _cfb ( o , opts ) ;
return o ;
}
function cfb _add ( cfb /*:CFBContainer*/ , name /*:string*/ , content /*:?RawBytes*/ , opts /*:?any*/ ) /*:CFBEntry*/ {
var unsafe = opts && opts . unsafe ;
if ( ! unsafe ) init _cfb ( cfb ) ;
var file = ! unsafe && CFB . find ( cfb , name ) ;
if ( ! file ) {
var fpath /*:string*/ = cfb . FullPaths [ 0 ] ;
if ( name . slice ( 0 , fpath . length ) == fpath ) fpath = name ;
else {
if ( fpath . slice ( - 1 ) != "/" ) fpath += "/" ;
fpath = ( fpath + name ) . replace ( "//" , "/" ) ;
}
file = ( { name : filename ( name ) , type : 2 } /*:any*/ ) ;
cfb . FileIndex . push ( file ) ;
cfb . FullPaths . push ( fpath ) ;
if ( ! unsafe ) CFB . utils . cfb _gc ( cfb ) ;
}
/*:: if(!file) throw new Error("unreachable"); */
file . content = ( content /*:any*/ ) ;
file . size = content ? content . length : 0 ;
if ( opts ) {
if ( opts . CLSID ) file . clsid = opts . CLSID ;
if ( opts . mt ) file . mt = opts . mt ;
if ( opts . ct ) file . ct = opts . ct ;
}
return file ;
}
function cfb _del ( cfb /*:CFBContainer*/ , name /*:string*/ ) /*:boolean*/ {
init _cfb ( cfb ) ;
var file = CFB . find ( cfb , name ) ;
if ( file ) for ( var j = 0 ; j < cfb . FileIndex . length ; ++ j ) if ( cfb . FileIndex [ j ] == file ) {
cfb . FileIndex . splice ( j , 1 ) ;
cfb . FullPaths . splice ( j , 1 ) ;
return true ;
}
return false ;
}
function cfb _mov ( cfb /*:CFBContainer*/ , old _name /*:string*/ , new _name /*:string*/ ) /*:boolean*/ {
init _cfb ( cfb ) ;
var file = CFB . find ( cfb , old _name ) ;
if ( file ) for ( var j = 0 ; j < cfb . FileIndex . length ; ++ j ) if ( cfb . FileIndex [ j ] == file ) {
cfb . FileIndex [ j ] . name = filename ( new _name ) ;
cfb . FullPaths [ j ] = new _name ;
return true ;
}
return false ;
}
function cfb _gc ( cfb /*:CFBContainer*/ ) /*:void*/ { rebuild _cfb ( cfb , true ) ; }
exports . find = find ;
exports . read = read ;
exports . parse = parse ;
exports . write = write ;
exports . writeFile = write _file ;
exports . utils = {
cfb _new : cfb _new ,
cfb _add : cfb _add ,
cfb _del : cfb _del ,
cfb _mov : cfb _mov ,
cfb _gc : cfb _gc ,
ReadShift : ReadShift ,
CheckField : CheckField ,
prep _blob : prep _blob ,
bconcat : bconcat ,
use _zlib : use _zlib ,
_deflateRaw : _deflate ,
_inflateRaw : _inflate ,
consts : consts
} ;
return exports ;
} ) ( ) ;
if ( typeof require !== 'undefined' && typeof module !== 'undefined' && typeof DO _NOT _EXPORT _CFB === 'undefined' ) { module . exports = CFB ; }
const _fs = void 0 ;
/* normalize data for blob ctor */
function blobify ( data ) {
if ( typeof data === "string" ) return s2ab ( data ) ;
if ( Array . isArray ( data ) ) return a2u ( data ) ;
return data ;
}
/* write or download file */
function write _dl ( fname /*:string*/ , payload /*:any*/ , enc /*:?string*/ ) {
/*global IE_SaveFile, Blob, navigator, saveAs, document, File, chrome */
if ( typeof _fs !== 'undefined' && _fs . writeFileSync ) return enc ? _fs . writeFileSync ( fname , payload , enc ) : _fs . writeFileSync ( fname , payload ) ;
var data = ( enc == "utf8" ) ? utf8write ( payload ) : payload ;
/*:: declare var IE_SaveFile: any; */
if ( typeof IE _SaveFile !== 'undefined' ) return IE _SaveFile ( data , fname ) ;
if ( typeof Blob !== 'undefined' ) {
var blob = new Blob ( [ blobify ( data ) ] , { type : "application/octet-stream" } ) ;
/*:: declare var navigator: any; */
if ( typeof navigator !== 'undefined' && navigator . msSaveBlob ) return navigator . msSaveBlob ( blob , fname ) ;
/*:: declare var saveAs: any; */
if ( typeof saveAs !== 'undefined' ) return saveAs ( blob , fname ) ;
if ( typeof URL !== 'undefined' && typeof document !== 'undefined' && document . createElement && URL . createObjectURL ) {
var url = URL . createObjectURL ( blob ) ;
/*:: declare var chrome: any; */
if ( typeof chrome === 'object' && typeof ( chrome . downloads || { } ) . download == "function" ) {
if ( URL . revokeObjectURL && typeof setTimeout !== 'undefined' ) setTimeout ( function ( ) { URL . revokeObjectURL ( url ) ; } , 60000 ) ;
return chrome . downloads . download ( { url : url , filename : fname , saveAs : true } ) ;
}
var a = document . createElement ( "a" ) ;
if ( a . download != null ) {
/*:: if(document.body == null) throw new Error("unreachable"); */
a . download = fname ; a . href = url ; document . body . appendChild ( a ) ; a . click ( ) ;
/*:: if(document.body == null) throw new Error("unreachable"); */ document . body . removeChild ( a ) ;
if ( URL . revokeObjectURL && typeof setTimeout !== 'undefined' ) setTimeout ( function ( ) { URL . revokeObjectURL ( url ) ; } , 60000 ) ;
return url ;
}
}
}
// $FlowIgnore
if ( typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined' ) try { // extendscript
// $FlowIgnore
var out = File ( fname ) ; out . open ( "w" ) ; out . encoding = "binary" ;
if ( Array . isArray ( payload ) ) payload = a2s ( payload ) ;
out . write ( payload ) ; out . close ( ) ; return payload ;
} catch ( e ) { if ( ! e . message || ! e . message . match ( /onstruct/ ) ) throw e ; }
throw new Error ( "cannot save file " + fname ) ;
}
/* read binary data from file */
function read _binary ( path /*:string*/ ) {
if ( typeof _fs !== 'undefined' ) return _fs . readFileSync ( path ) ;
// $FlowIgnore
if ( typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined' ) try { // extendscript
// $FlowIgnore
var infile = File ( path ) ; infile . open ( "r" ) ; infile . encoding = "binary" ;
var data = infile . read ( ) ; infile . close ( ) ;
return data ;
} catch ( e ) { if ( ! e . message || ! e . message . match ( /onstruct/ ) ) throw e ; }
throw new Error ( "Cannot access file " + path ) ;
}
function keys ( o /*:any*/ ) /*:Array<any>*/ {
var ks = Object . keys ( o ) , o2 = [ ] ;
for ( var i = 0 ; i < ks . length ; ++ i ) if ( Object . prototype . hasOwnProperty . call ( o , ks [ i ] ) ) o2 . push ( ks [ i ] ) ;
return o2 ;
}
function evert _key ( obj /*:any*/ , key /*:string*/ ) /*:EvertType*/ {
var o = ( [ ] /*:any*/ ) , K = keys ( obj ) ;
for ( var i = 0 ; i !== K . length ; ++ i ) if ( o [ obj [ K [ i ] ] [ key ] ] == null ) o [ obj [ K [ i ] ] [ key ] ] = K [ i ] ;
return o ;
}
function evert ( obj /*:any*/ ) /*:EvertType*/ {
var o = ( [ ] /*:any*/ ) , K = keys ( obj ) ;
for ( var i = 0 ; i !== K . length ; ++ i ) o [ obj [ K [ i ] ] ] = K [ i ] ;
return o ;
}
function evert _num ( obj /*:any*/ ) /*:EvertNumType*/ {
var o = ( [ ] /*:any*/ ) , K = keys ( obj ) ;
for ( var i = 0 ; i !== K . length ; ++ i ) o [ obj [ K [ i ] ] ] = parseInt ( K [ i ] , 10 ) ;
return o ;
}
function evert _arr ( obj /*:any*/ ) /*:EvertArrType*/ {
var o /*:EvertArrType*/ = ( [ ] /*:any*/ ) , K = keys ( obj ) ;
for ( var i = 0 ; i !== K . length ; ++ i ) {
if ( o [ obj [ K [ i ] ] ] == null ) o [ obj [ K [ i ] ] ] = [ ] ;
o [ obj [ K [ i ] ] ] . push ( K [ i ] ) ;
}
return o ;
}
var basedate = new Date ( 1899 , 11 , 30 , 0 , 0 , 0 ) ; // 2209161600000
function datenum ( v /*:Date*/ , date1904 /*:?boolean*/ ) /*:number*/ {
var epoch = v . getTime ( ) ;
if ( date1904 ) epoch -= 1462 * 24 * 60 * 60 * 1000 ;
var dnthresh = basedate . getTime ( ) + ( v . getTimezoneOffset ( ) - basedate . getTimezoneOffset ( ) ) * 60000 ;
return ( epoch - dnthresh ) / ( 24 * 60 * 60 * 1000 ) ;
}
var refdate = new Date ( ) ;
var dnthresh = basedate . getTime ( ) + ( refdate . getTimezoneOffset ( ) - basedate . getTimezoneOffset ( ) ) * 60000 ;
var refoffset = refdate . getTimezoneOffset ( ) ;
function numdate ( v /*:number*/ ) /*:Date*/ {
var out = new Date ( ) ;
out . setTime ( v * 24 * 60 * 60 * 1000 + dnthresh ) ;
if ( out . getTimezoneOffset ( ) !== refoffset ) {
out . setTime ( out . getTime ( ) + ( out . getTimezoneOffset ( ) - refoffset ) * 60000 ) ;
}
return out ;
}
/* ISO 8601 Duration */
function parse _isodur ( s ) {
var sec = 0 , mt = 0 , time = false ;
var m = s . match ( /P([0-9\.]+Y)?([0-9\.]+M)?([0-9\.]+D)?T([0-9\.]+H)?([0-9\.]+M)?([0-9\.]+S)?/ ) ;
if ( ! m ) throw new Error ( "|" + s + "| is not an ISO8601 Duration" ) ;
for ( var i = 1 ; i != m . length ; ++ i ) {
if ( ! m [ i ] ) continue ;
mt = 1 ;
if ( i > 3 ) time = true ;
switch ( m [ i ] . slice ( m [ i ] . length - 1 ) ) {
case 'Y' :
throw new Error ( "Unsupported ISO Duration Field: " + m [ i ] . slice ( m [ i ] . length - 1 ) ) ;
case 'D' : mt *= 24 ;
/* falls through */
case 'H' : mt *= 60 ;
/* falls through */
case 'M' :
if ( ! time ) throw new Error ( "Unsupported ISO Duration Field: M" ) ;
else mt *= 60 ;
/* falls through */
case 'S' : break ;
}
sec += mt * parseInt ( m [ i ] , 10 ) ;
}
return sec ;
}
var good _pd _date = new Date ( '2017-02-19T19:06:09.000Z' ) ;
if ( isNaN ( good _pd _date . getFullYear ( ) ) ) good _pd _date = new Date ( '2/19/17' ) ;
var good _pd = good _pd _date . getFullYear ( ) == 2017 ;
/* parses a date as a local date */
function parseDate ( str /*:string|Date*/ , fixdate /*:?number*/ ) /*:Date*/ {
var d = new Date ( str ) ;
if ( good _pd ) {
/*:: if(fixdate == null) fixdate = 0; */
if ( fixdate > 0 ) d . setTime ( d . getTime ( ) + d . getTimezoneOffset ( ) * 60 * 1000 ) ;
else if ( fixdate < 0 ) d . setTime ( d . getTime ( ) - d . getTimezoneOffset ( ) * 60 * 1000 ) ;
return d ;
}
if ( str instanceof Date ) return str ;
if ( good _pd _date . getFullYear ( ) == 1917 && ! isNaN ( d . getFullYear ( ) ) ) {
var s = d . getFullYear ( ) ;
if ( str . indexOf ( "" + s ) > - 1 ) return d ;
d . setFullYear ( d . getFullYear ( ) + 100 ) ; return d ;
}
var n = str . match ( /\d+/g ) || [ "2017" , "2" , "19" , "0" , "0" , "0" ] ;
var out = new Date ( + n [ 0 ] , + n [ 1 ] - 1 , + n [ 2 ] , ( + n [ 3 ] || 0 ) , ( + n [ 4 ] || 0 ) , ( + n [ 5 ] || 0 ) ) ;
if ( str . indexOf ( "Z" ) > - 1 ) out = new Date ( out . getTime ( ) - out . getTimezoneOffset ( ) * 60 * 1000 ) ;
return out ;
}
function cc2str ( arr /*:Array<number>*/ ) /*:string*/ {
var o = "" ;
for ( var i = 0 ; i != arr . length ; ++ i ) o += String . fromCharCode ( arr [ i ] ) ;
return o ;
}
function dup ( o /*:any*/ ) /*:any*/ {
if ( typeof JSON != 'undefined' && ! Array . isArray ( o ) ) return JSON . parse ( JSON . stringify ( o ) ) ;
if ( typeof o != 'object' || o == null ) return o ;
if ( o instanceof Date ) return new Date ( o . getTime ( ) ) ;
var out = { } ;
for ( var k in o ) if ( Object . prototype . hasOwnProperty . call ( o , k ) ) out [ k ] = dup ( o [ k ] ) ;
return out ;
}
function fill ( c /*:string*/ , l /*:number*/ ) /*:string*/ { var o = "" ; while ( o . length < l ) o += c ; return o ; }
/* TODO: stress test */
function fuzzynum ( s /*:string*/ ) /*:number*/ {
var v /*:number*/ = Number ( s ) ;
2021-09-16 01:50:33 +00:00
if ( isFinite ( v ) ) return v ;
if ( ! isNaN ( v ) ) return NaN ;
2021-09-12 11:11:48 +00:00
if ( ! /\d/ . test ( s ) ) return v ;
var wt = 1 ;
var ss = s . replace ( /([\d]),([\d])/g , "$1$2" ) . replace ( /[$]/g , "" ) . replace ( /[%]/g , function ( ) { wt *= 100 ; return "" ; } ) ;
if ( ! isNaN ( v = Number ( ss ) ) ) return v / wt ;
ss = ss . replace ( /[(](.*)[)]/ , function ( $$ , $1 ) { wt = - wt ; return $1 ; } ) ;
if ( ! isNaN ( v = Number ( ss ) ) ) return v / wt ;
return v ;
}
function fuzzydate ( s /*:string*/ ) /*:Date*/ {
var o = new Date ( s ) , n = new Date ( NaN ) ;
var y = o . getYear ( ) , m = o . getMonth ( ) , d = o . getDate ( ) ;
if ( isNaN ( d ) ) return n ;
if ( y < 0 || y > 8099 ) return n ;
if ( ( m > 0 || d > 1 ) && y != 101 ) return o ;
if ( s . toLowerCase ( ) . match ( /jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/ ) ) return o ;
if ( s . match ( /[^-0-9:,\/\\]/ ) ) return n ;
return o ;
}
var safe _split _regex = "abacaba" . split ( /(:?b)/i ) . length == 5 ;
function split _regex ( str /*:string*/ , re , def /*:string*/ ) /*:Array<string>*/ {
if ( safe _split _regex || typeof re == "string" ) return str . split ( re ) ;
var p = str . split ( re ) , o = [ p [ 0 ] ] ;
for ( var i = 1 ; i < p . length ; ++ i ) { o . push ( def ) ; o . push ( p [ i ] ) ; }
return o ;
}
function getdatastr ( data ) /*:?string*/ {
if ( ! data ) return null ;
if ( data . data ) return debom ( data . data ) ;
if ( data . asNodeBuffer && has _buf ) return debom ( data . asNodeBuffer ( ) . toString ( 'binary' ) ) ;
if ( data . asBinary ) return debom ( data . asBinary ( ) ) ;
if ( data . _data && data . _data . getContent ) return debom ( cc2str ( Array . prototype . slice . call ( data . _data . getContent ( ) , 0 ) ) ) ;
if ( data . content && data . type ) return debom ( cc2str ( data . content ) ) ;
return null ;
}
function getdatabin ( data ) {
if ( ! data ) return null ;
if ( data . data ) return char _codes ( data . data ) ;
if ( data . asNodeBuffer && has _buf ) return data . asNodeBuffer ( ) ;
if ( data . _data && data . _data . getContent ) {
var o = data . _data . getContent ( ) ;
if ( typeof o == "string" ) return char _codes ( o ) ;
return Array . prototype . slice . call ( o ) ;
}
if ( data . content && data . type ) return data . content ;
return null ;
}
function getdata ( data ) { return ( data && data . name . slice ( - 4 ) === ".bin" ) ? getdatabin ( data ) : getdatastr ( data ) ; }
/* Part 2 Section 10.1.2 "Mapping Content Types" Names are case-insensitive */
/* OASIS does not comment on filename case sensitivity */
function safegetzipfile ( zip , file /*:string*/ ) {
var k = zip . FullPaths || keys ( zip . files ) ;
2021-10-13 07:20:25 +00:00
var f = file . toLowerCase ( ) . replace ( /[\/]/g , '\\' ) , g = f . replace ( /\\/g , '\/' ) ;
2021-09-12 11:11:48 +00:00
for ( var i = 0 ; i < k . length ; ++ i ) {
var n = k [ i ] . replace ( /^Root Entry[\/]/ , "" ) . toLowerCase ( ) ;
2021-10-13 07:20:25 +00:00
if ( f == n || g == n ) return zip . files ? zip . files [ k [ i ] ] : zip . FileIndex [ i ] ;
2021-09-12 11:11:48 +00:00
}
return null ;
}
function getzipfile ( zip , file /*:string*/ ) {
var o = safegetzipfile ( zip , file ) ;
if ( o == null ) throw new Error ( "Cannot find file " + file + " in zip" ) ;
return o ;
}
function getzipdata ( zip , file /*:string*/ , safe /*:?boolean*/ ) /*:any*/ {
if ( ! safe ) return getdata ( getzipfile ( zip , file ) ) ;
if ( ! file ) return null ;
try { return getzipdata ( zip , file ) ; } catch ( e ) { return null ; }
}
function getzipstr ( zip , file /*:string*/ , safe /*:?boolean*/ ) /*:?string*/ {
if ( ! safe ) return getdatastr ( getzipfile ( zip , file ) ) ;
if ( ! file ) return null ;
try { return getzipstr ( zip , file ) ; } catch ( e ) { return null ; }
}
function zipentries ( zip ) {
var k = zip . FullPaths || keys ( zip . files ) , o = [ ] ;
for ( var i = 0 ; i < k . length ; ++ i ) if ( k [ i ] . slice ( - 1 ) != '/' ) o . push ( k [ i ] . replace ( /^Root Entry[\/]/ , "" ) ) ;
return o . sort ( ) ;
}
function zip _add _file ( zip , path , content ) {
if ( zip . FullPaths ) CFB . utils . cfb _add ( zip , path , typeof content == "string" ? ( has _buf ? Buffer _from ( content ) : s2a ( utf8write ( content ) ) ) : content ) ;
else zip . file ( path , content ) ;
}
2021-09-16 01:50:33 +00:00
var jszip ;
2021-09-12 11:11:48 +00:00
function zip _new ( ) {
return CFB . utils . cfb _new ( ) ;
}
function zip _read ( d , o ) {
var zip ;
switch ( o . type ) {
case "base64" : zip = CFB . read ( d , { type : "base64" } ) ; break ;
case "binary" : zip = CFB . read ( d , { type : "binary" } ) ; break ;
case "buffer" : case "array" : zip = CFB . read ( d , { type : "buffer" } ) ; break ;
default : throw new Error ( "Unrecognized type " + o . type ) ;
}
return zip ;
}
function resolve _path ( path /*:string*/ , base /*:string*/ ) /*:string*/ {
if ( path . charAt ( 0 ) == "/" ) return path . slice ( 1 ) ;
var result = base . split ( '/' ) ;
if ( base . slice ( - 1 ) != "/" ) result . pop ( ) ; // folder path
var target = path . split ( '/' ) ;
while ( target . length !== 0 ) {
var step = target . shift ( ) ;
if ( step === '..' ) result . pop ( ) ;
else if ( step !== '.' ) result . push ( step ) ;
}
return result . join ( '/' ) ;
}
var XML _HEADER = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n' ;
var attregexg = /([^"\s?>\/]+)\s*=\s*((?:")([^"]*)(?:")|(?:')([^']*)(?:')|([^'">\s]+))/g ;
var tagregex = /<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s*[\/\?]?>/mg ;
if ( ! ( XML _HEADER . match ( tagregex ) ) ) tagregex = /<[^>]*>/g ;
var nsregex = /<\w*:/ , nsregex2 = /<(\/?)\w+:/ ;
function parsexmltag ( tag /*:string*/ , skip _root /*:?boolean*/ , skip _LC /*:?boolean*/ ) /*:any*/ {
var z = ( { } /*:any*/ ) ;
var eq = 0 , c = 0 ;
for ( ; eq !== tag . length ; ++ eq ) if ( ( c = tag . charCodeAt ( eq ) ) === 32 || c === 10 || c === 13 ) break ;
if ( ! skip _root ) z [ 0 ] = tag . slice ( 0 , eq ) ;
if ( eq === tag . length ) return z ;
var m = tag . match ( attregexg ) , j = 0 , v = "" , i = 0 , q = "" , cc = "" , quot = 1 ;
if ( m ) for ( i = 0 ; i != m . length ; ++ i ) {
cc = m [ i ] ;
for ( c = 0 ; c != cc . length ; ++ c ) if ( cc . charCodeAt ( c ) === 61 ) break ;
q = cc . slice ( 0 , c ) . trim ( ) ;
while ( cc . charCodeAt ( c + 1 ) == 32 ) ++ c ;
quot = ( ( eq = cc . charCodeAt ( c + 1 ) ) == 34 || eq == 39 ) ? 1 : 0 ;
v = cc . slice ( c + 1 + quot , cc . length - quot ) ;
for ( j = 0 ; j != q . length ; ++ j ) if ( q . charCodeAt ( j ) === 58 ) break ;
if ( j === q . length ) {
if ( q . indexOf ( "_" ) > 0 ) q = q . slice ( 0 , q . indexOf ( "_" ) ) ; // from ods
z [ q ] = v ;
if ( ! skip _LC ) z [ q . toLowerCase ( ) ] = v ;
}
else {
var k = ( j === 5 && q . slice ( 0 , 5 ) === "xmlns" ? "xmlns" : "" ) + q . slice ( j + 1 ) ;
if ( z [ k ] && q . slice ( j - 3 , j ) == "ext" ) continue ; // from ods
z [ k ] = v ;
if ( ! skip _LC ) z [ k . toLowerCase ( ) ] = v ;
}
}
return z ;
}
function strip _ns ( x /*:string*/ ) /*:string*/ { return x . replace ( nsregex2 , "<$1" ) ; }
var encodings = {
'"' : '"' ,
''' : "'" ,
'>' : '>' ,
'<' : '<' ,
'&' : '&'
} ;
var rencoding = evert ( encodings ) ;
//var rencstr = "&<>'\"".split("");
// TODO: CP remap (need to read file version to determine OS)
var unescapexml /*:StringConv*/ = ( function ( ) {
/* 22.4.2.4 bstr (Basic String) */
var encregex = /&(?:quot|apos|gt|lt|amp|#x?([\da-fA-F]+));/ig , coderegex = /_x([\da-fA-F]{4})_/ig ;
return function unescapexml ( text /*:string*/ ) /*:string*/ {
var s = text + '' , i = s . indexOf ( "<![CDATA[" ) ;
if ( i == - 1 ) return s . replace ( encregex , function ( $$ , $1 ) { return encodings [ $$ ] || String . fromCharCode ( parseInt ( $1 , $$ . indexOf ( "x" ) > - 1 ? 16 : 10 ) ) || $$ ; } ) . replace ( coderegex , function ( m , c ) { return String . fromCharCode ( parseInt ( c , 16 ) ) ; } ) ;
var j = s . indexOf ( "]]>" ) ;
return unescapexml ( s . slice ( 0 , i ) ) + s . slice ( i + 9 , j ) + unescapexml ( s . slice ( j + 3 ) ) ;
} ;
} ) ( ) ;
var decregex = /[&<>'"]/g , charegex = /[\u0000-\u0008\u000b-\u001f]/g ;
function escapexml ( text /*:string*/ ) /*:string*/ {
var s = text + '' ;
return s . replace ( decregex , function ( y ) { return rencoding [ y ] ; } ) . replace ( charegex , function ( s ) { return "_x" + ( "000" + s . charCodeAt ( 0 ) . toString ( 16 ) ) . slice ( - 4 ) + "_" ; } ) ;
}
function escapexmltag ( text /*:string*/ ) /*:string*/ { return escapexml ( text ) . replace ( / /g , "_x0020_" ) ; }
var htmlcharegex = /[\u0000-\u001f]/g ;
function escapehtml ( text /*:string*/ ) /*:string*/ {
var s = text + '' ;
return s . replace ( decregex , function ( y ) { return rencoding [ y ] ; } ) . replace ( /\n/g , "<br/>" ) . replace ( htmlcharegex , function ( s ) { return "&#x" + ( "000" + s . charCodeAt ( 0 ) . toString ( 16 ) ) . slice ( - 4 ) + ";" ; } ) ;
}
function escapexlml ( text /*:string*/ ) /*:string*/ {
var s = text + '' ;
return s . replace ( decregex , function ( y ) { return rencoding [ y ] ; } ) . replace ( htmlcharegex , function ( s ) { return "&#x" + ( s . charCodeAt ( 0 ) . toString ( 16 ) ) . toUpperCase ( ) + ";" ; } ) ;
}
/* TODO: handle codepages */
var xlml _fixstr /*:StringConv*/ = ( function ( ) {
var entregex = /&#(\d+);/g ;
function entrepl ( $$ /*:string*/ , $1 /*:string*/ ) /*:string*/ { return String . fromCharCode ( parseInt ( $1 , 10 ) ) ; }
return function xlml _fixstr ( str /*:string*/ ) /*:string*/ { return str . replace ( entregex , entrepl ) ; } ;
} ) ( ) ;
var xlml _unfixstr /*:StringConv*/ = ( function ( ) {
return function xlml _unfixstr ( str /*:string*/ ) /*:string*/ { return str . replace ( /(\r\n|[\r\n])/g , "\ " ) ; } ;
} ) ( ) ;
function parsexmlbool ( value /*:any*/ ) /*:boolean*/ {
switch ( value ) {
case 1 : case true : case '1' : case 'true' : case 'TRUE' : return true ;
/* case '0': case 'false': case 'FALSE':*/
default : return false ;
}
}
var utf8read /*:StringConv*/ = function utf8reada ( orig /*:string*/ ) /*:string*/ {
var out = "" , i = 0 , c = 0 , d = 0 , e = 0 , f = 0 , w = 0 ;
while ( i < orig . length ) {
c = orig . charCodeAt ( i ++ ) ;
if ( c < 128 ) { out += String . fromCharCode ( c ) ; continue ; }
d = orig . charCodeAt ( i ++ ) ;
if ( c > 191 && c < 224 ) { f = ( ( c & 31 ) << 6 ) ; f |= ( d & 63 ) ; out += String . fromCharCode ( f ) ; continue ; }
e = orig . charCodeAt ( i ++ ) ;
if ( c < 240 ) { out += String . fromCharCode ( ( ( c & 15 ) << 12 ) | ( ( d & 63 ) << 6 ) | ( e & 63 ) ) ; continue ; }
f = orig . charCodeAt ( i ++ ) ;
w = ( ( ( c & 7 ) << 18 ) | ( ( d & 63 ) << 12 ) | ( ( e & 63 ) << 6 ) | ( f & 63 ) ) - 65536 ;
out += String . fromCharCode ( 0xD800 + ( ( w >>> 10 ) & 1023 ) ) ;
out += String . fromCharCode ( 0xDC00 + ( w & 1023 ) ) ;
}
return out ;
} ;
var utf8write /*:StringConv*/ = function ( orig /*:string*/ ) /*:string*/ {
var out /*:Array<string>*/ = [ ] , i = 0 , c = 0 , d = 0 ;
while ( i < orig . length ) {
c = orig . charCodeAt ( i ++ ) ;
switch ( true ) {
case c < 128 : out . push ( String . fromCharCode ( c ) ) ; break ;
case c < 2048 :
out . push ( String . fromCharCode ( 192 + ( c >> 6 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( c & 63 ) ) ) ;
break ;
case c >= 55296 && c < 57344 :
c -= 55296 ; d = orig . charCodeAt ( i ++ ) - 56320 + ( c << 10 ) ;
out . push ( String . fromCharCode ( 240 + ( ( d >> 18 ) & 7 ) ) ) ;
out . push ( String . fromCharCode ( 144 + ( ( d >> 12 ) & 63 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( ( d >> 6 ) & 63 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( d & 63 ) ) ) ;
break ;
default :
out . push ( String . fromCharCode ( 224 + ( c >> 12 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( ( c >> 6 ) & 63 ) ) ) ;
out . push ( String . fromCharCode ( 128 + ( c & 63 ) ) ) ;
}
}
return out . join ( "" ) ;
} ;
if ( has _buf ) {
var utf8readb = function utf8readb ( data ) {
var out = Buffer . alloc ( 2 * data . length ) , w , i , j = 1 , k = 0 , ww = 0 , c ;
for ( i = 0 ; i < data . length ; i += j ) {
j = 1 ;
if ( ( c = data . charCodeAt ( i ) ) < 128 ) w = c ;
else if ( c < 224 ) { w = ( c & 31 ) * 64 + ( data . charCodeAt ( i + 1 ) & 63 ) ; j = 2 ; }
else if ( c < 240 ) { w = ( c & 15 ) * 4096 + ( data . charCodeAt ( i + 1 ) & 63 ) * 64 + ( data . charCodeAt ( i + 2 ) & 63 ) ; j = 3 ; }
else { j = 4 ;
w = ( c & 7 ) * 262144 + ( data . charCodeAt ( i + 1 ) & 63 ) * 4096 + ( data . charCodeAt ( i + 2 ) & 63 ) * 64 + ( data . charCodeAt ( i + 3 ) & 63 ) ;
w -= 65536 ; ww = 0xD800 + ( ( w >>> 10 ) & 1023 ) ; w = 0xDC00 + ( w & 1023 ) ;
}
if ( ww !== 0 ) { out [ k ++ ] = ww & 255 ; out [ k ++ ] = ww >>> 8 ; ww = 0 ; }
out [ k ++ ] = w % 256 ; out [ k ++ ] = w >>> 8 ;
}
return out . slice ( 0 , k ) . toString ( 'ucs2' ) ;
} ;
var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3" ;
if ( utf8read ( corpus ) == utf8readb ( corpus ) ) utf8read = utf8readb ;
var utf8readc = function utf8readc ( data ) { return Buffer _from ( data , 'binary' ) . toString ( 'utf8' ) ; } ;
if ( utf8read ( corpus ) == utf8readc ( corpus ) ) utf8read = utf8readc ;
utf8write = function ( data ) { return Buffer _from ( data , 'utf8' ) . toString ( "binary" ) ; } ;
}
// matches <foo>...</foo> extracts content
var matchtag = ( function ( ) {
var mtcache /*:{[k:string]:RegExp}*/ = ( { } /*:any*/ ) ;
return function matchtag ( f /*:string*/ , g /*:?string*/ ) /*:RegExp*/ {
var t = f + "|" + ( g || "" ) ;
if ( mtcache [ t ] ) return mtcache [ t ] ;
return ( mtcache [ t ] = new RegExp ( '<(?:\\w+:)?' + f + '(?: xml:space="preserve")?(?:[^>]*)>([\\s\\S]*?)</(?:\\w+:)?' + f + '>' , ( ( g || "" ) /*:any*/ ) ) ) ;
} ;
} ) ( ) ;
var htmldecode /*:{(s:string):string}*/ = ( function ( ) {
var entities /*:Array<[RegExp, string]>*/ = [
[ 'nbsp' , ' ' ] , [ 'middot' , '·' ] ,
[ 'quot' , '"' ] , [ 'apos' , "'" ] , [ 'gt' , '>' ] , [ 'lt' , '<' ] , [ 'amp' , '&' ]
] . map ( function ( x /*:[string, string]*/ ) { return [ new RegExp ( '&' + x [ 0 ] + ';' , "ig" ) , x [ 1 ] ] ; } ) ;
return function htmldecode ( str /*:string*/ ) /*:string*/ {
var o = str
// Remove new lines and spaces from start of content
. replace ( /^[\t\n\r ]+/ , "" )
// Remove new lines and spaces from end of content
. replace ( /[\t\n\r ]+$/ , "" )
// Added line which removes any white space characters after and before html tags
. replace ( />\s+/g , ">" ) . replace ( /\s+</g , "<" )
// Replace remaining new lines and spaces with space
. replace ( /[\t\n\r ]+/g , " " )
// Replace <br> tags with new lines
. replace ( /<\s*[bB][rR]\s*\/?>/g , "\n" )
// Strip HTML elements
. replace ( /<[^>]*>/g , "" ) ;
for ( var i = 0 ; i < entities . length ; ++ i ) o = o . replace ( entities [ i ] [ 0 ] , entities [ i ] [ 1 ] ) ;
return o ;
} ;
} ) ( ) ;
var vtregex = ( function ( ) { var vt _cache = { } ;
return function vt _regex ( bt ) {
if ( vt _cache [ bt ] !== undefined ) return vt _cache [ bt ] ;
return ( vt _cache [ bt ] = new RegExp ( "<(?:vt:)?" + bt + ">([\\s\\S]*?)</(?:vt:)?" + bt + ">" , 'g' ) ) ;
} ; } ) ( ) ;
var vtvregex = /<\/?(?:vt:)?variant>/g , vtmregex = /<(?:vt:)([^>]*)>([\s\S]*)</ ;
function parseVector ( data /*:string*/ , opts ) /*:Array<{v:string,t:string}>*/ {
var h = parsexmltag ( data ) ;
var matches /*:Array<string>*/ = data . match ( vtregex ( h . baseType ) ) || [ ] ;
var res /*:Array<any>*/ = [ ] ;
if ( matches . length != h . size ) {
if ( opts . WTF ) throw new Error ( "unexpected vector length " + matches . length + " != " + h . size ) ;
return res ;
}
matches . forEach ( function ( x /*:string*/ ) {
var v = x . replace ( vtvregex , "" ) . match ( vtmregex ) ;
if ( v ) res . push ( { v : utf8read ( v [ 2 ] ) , t : v [ 1 ] } ) ;
} ) ;
return res ;
}
var wtregex = /(^\s|\s$|\n)/ ;
function writetag ( f /*:string*/ , g /*:string*/ ) /*:string*/ { return '<' + f + ( g . match ( wtregex ) ? ' xml:space="preserve"' : "" ) + '>' + g + '</' + f + '>' ; }
function wxt _helper ( h ) /*:string*/ { return keys ( h ) . map ( function ( k ) { return " " + k + '="' + h [ k ] + '"' ; } ) . join ( "" ) ; }
function writextag ( f /*:string*/ , g /*:?string*/ , h ) { return '<' + f + ( ( h != null ) ? wxt _helper ( h ) : "" ) + ( ( g != null ) ? ( g . match ( wtregex ) ? ' xml:space="preserve"' : "" ) + '>' + g + '</' + f : "/" ) + '>' ; }
function write _w3cdtf ( d /*:Date*/ , t /*:?boolean*/ ) /*:string*/ { try { return d . toISOString ( ) . replace ( /\.\d*/ , "" ) ; } catch ( e ) { if ( t ) throw e ; } return "" ; }
function write _vt ( s , xlsx /*:?boolean*/ ) /*:string*/ {
switch ( typeof s ) {
case 'string' :
var o = writextag ( 'vt:lpwstr' , escapexml ( s ) ) ;
if ( xlsx ) o = o . replace ( /"/g , "_x0022_" ) ;
return o ;
case 'number' : return writextag ( ( s | 0 ) == s ? 'vt:i4' : 'vt:r8' , escapexml ( String ( s ) ) ) ;
case 'boolean' : return writextag ( 'vt:bool' , s ? 'true' : 'false' ) ;
}
if ( s instanceof Date ) return writextag ( 'vt:filetime' , write _w3cdtf ( s ) ) ;
throw new Error ( "Unable to serialize " + s ) ;
}
var XMLNS = ( {
'dc' : 'http://purl.org/dc/elements/1.1/' ,
'dcterms' : 'http://purl.org/dc/terms/' ,
'dcmitype' : 'http://purl.org/dc/dcmitype/' ,
'mx' : 'http://schemas.microsoft.com/office/mac/excel/2008/main' ,
'r' : 'http://schemas.openxmlformats.org/officeDocument/2006/relationships' ,
'sjs' : 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties' ,
'vt' : 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes' ,
'xsi' : 'http://www.w3.org/2001/XMLSchema-instance' ,
'xsd' : 'http://www.w3.org/2001/XMLSchema'
} /*:any*/ ) ;
XMLNS . main = [
'http://schemas.openxmlformats.org/spreadsheetml/2006/main' ,
'http://purl.oclc.org/ooxml/spreadsheetml/main' ,
'http://schemas.microsoft.com/office/excel/2006/main' ,
'http://schemas.microsoft.com/office/excel/2006/2'
] ;
var XLMLNS = ( {
'o' : 'urn:schemas-microsoft-com:office:office' ,
'x' : 'urn:schemas-microsoft-com:office:excel' ,
'ss' : 'urn:schemas-microsoft-com:office:spreadsheet' ,
'dt' : 'uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' ,
'mv' : 'http://macVmlSchemaUri' ,
'v' : 'urn:schemas-microsoft-com:vml' ,
'html' : 'http://www.w3.org/TR/REC-html40'
} /*:any*/ ) ;
function read _double _le ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ {
var s = 1 - 2 * ( b [ idx + 7 ] >>> 7 ) ;
var e = ( ( b [ idx + 7 ] & 0x7f ) << 4 ) + ( ( b [ idx + 6 ] >>> 4 ) & 0x0f ) ;
var m = ( b [ idx + 6 ] & 0x0f ) ;
for ( var i = 5 ; i >= 0 ; -- i ) m = m * 256 + b [ idx + i ] ;
if ( e == 0x7ff ) return m == 0 ? ( s * Infinity ) : NaN ;
if ( e == 0 ) e = - 1022 ;
else { e -= 1023 ; m += Math . pow ( 2 , 52 ) ; }
return s * Math . pow ( 2 , e - 52 ) * m ;
}
function write _double _le ( b /*:RawBytes|CFBlob*/ , v /*:number*/ , idx /*:number*/ ) {
var bs = ( ( ( ( v < 0 ) || ( 1 / v == - Infinity ) ) ? 1 : 0 ) << 7 ) , e = 0 , m = 0 ;
var av = bs ? ( - v ) : v ;
if ( ! isFinite ( av ) ) { e = 0x7ff ; m = isNaN ( v ) ? 0x6969 : 0 ; }
else if ( av == 0 ) e = m = 0 ;
else {
e = Math . floor ( Math . log ( av ) / Math . LN2 ) ;
m = av * Math . pow ( 2 , 52 - e ) ;
if ( ( e <= - 1023 ) && ( ! isFinite ( m ) || ( m < Math . pow ( 2 , 52 ) ) ) ) { e = - 1022 ; }
else { m -= Math . pow ( 2 , 52 ) ; e += 1023 ; }
}
for ( var i = 0 ; i <= 5 ; ++ i , m /= 256 ) b [ idx + i ] = m & 0xff ;
b [ idx + 6 ] = ( ( e & 0x0f ) << 4 ) | ( m & 0xf ) ;
b [ idx + 7 ] = ( e >> 4 ) | bs ;
}
var _ _toBuffer = function ( bufs /*:Array<Array<RawBytes> >*/ ) /*:RawBytes*/ { var x = [ ] , w = 10240 ; for ( var i = 0 ; i < bufs [ 0 ] . length ; ++ i ) if ( bufs [ 0 ] [ i ] ) for ( var j = 0 , L = bufs [ 0 ] [ i ] . length ; j < L ; j += w ) x . push . apply ( x , bufs [ 0 ] [ i ] . slice ( j , j + w ) ) ; return x ; } ;
var _ _ _toBuffer = _ _toBuffer ;
var _ _utf16le = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) /*:string*/ { var ss /*:Array<string>*/ = [ ] ; for ( var i = s ; i < e ; i += 2 ) ss . push ( String . fromCharCode ( _ _readUInt16LE ( b , i ) ) ) ; return ss . join ( "" ) . replace ( chr0 , '' ) ; } ;
var _ _ _utf16le = _ _utf16le ;
var _ _hexlify = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , l /*:number*/ ) /*:string*/ { var ss /*:Array<string>*/ = [ ] ; for ( var i = s ; i < s + l ; ++ i ) ss . push ( ( "0" + b [ i ] . toString ( 16 ) ) . slice ( - 2 ) ) ; return ss . join ( "" ) ; } ;
var _ _ _hexlify = _ _hexlify ;
var _ _utf8 = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { var ss = [ ] ; for ( var i = s ; i < e ; i ++ ) ss . push ( String . fromCharCode ( _ _readUInt8 ( b , i ) ) ) ; return ss . join ( "" ) ; } ;
var _ _ _utf8 = _ _utf8 ;
var _ _lpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _ _lpstr = _ _lpstr ;
var _ _cpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _ _cpstr = _ _cpstr ;
var _ _lpwstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = 2 * _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len - 1 ) : "" ; } ;
var _ _ _lpwstr = _ _lpwstr ;
var _ _lpp4 , _ _ _lpp4 ;
_ _lpp4 = _ _ _lpp4 = function lpp4 _ ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf16le ( b , i + 4 , i + 4 + len ) : "" ; } ;
var _ _8lpp4 = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? _ _utf8 ( b , i + 4 , i + 4 + len ) : "" ; } ;
var _ _ _8lpp4 = _ _8lpp4 ;
var _ _double , _ _ _double ;
_ _double = _ _ _double = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) { return read _double _le ( b , idx ) ; } ;
var is _buf = function is _buf _a ( a ) { return Array . isArray ( a ) ; } ;
if ( has _buf /*:: && typeof Buffer !== 'undefined'*/ ) {
_ _utf16le = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) /*:string*/ { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _utf16le ( b , s , e ) ; return b . toString ( 'utf16le' , s , e ) . replace ( chr0 , '' ) /*.replace(chr1,'!')*/ ; } ;
_ _hexlify = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , l /*:number*/ ) /*:string*/ { return Buffer . isBuffer ( b ) /*:: && b instanceof Buffer*/ ? b . toString ( 'hex' , s , s + l ) : _ _ _hexlify ( b , s , l ) ; } ;
_ _lpstr = function lpstr _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _lpstr ( b , i ) ; var len = b . readUInt32LE ( i ) ; return len > 0 ? b . toString ( 'utf8' , i + 4 , i + 4 + len - 1 ) : "" ; } ;
_ _cpstr = function cpstr _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _cpstr ( b , i ) ; var len = b . readUInt32LE ( i ) ; return len > 0 ? b . toString ( 'utf8' , i + 4 , i + 4 + len - 1 ) : "" ; } ;
_ _lpwstr = function lpwstr _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _lpwstr ( b , i ) ; var len = 2 * b . readUInt32LE ( i ) ; return b . toString ( 'utf16le' , i + 4 , i + 4 + len - 1 ) ; } ;
_ _lpp4 = function lpp4 _b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _lpp4 ( b , i ) ; var len = b . readUInt32LE ( i ) ; return b . toString ( 'utf16le' , i + 4 , i + 4 + len ) ; } ;
_ _8lpp4 = function lpp4 _8b ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( ! Buffer . isBuffer ( b ) /*:: || !(b instanceof Buffer)*/ ) return _ _ _8lpp4 ( b , i ) ; var len = b . readUInt32LE ( i ) ; return b . toString ( 'utf8' , i + 4 , i + 4 + len ) ; } ;
_ _utf8 = function utf8 _b ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { return ( Buffer . isBuffer ( b ) /*:: && (b instanceof Buffer)*/ ) ? b . toString ( 'utf8' , s , e ) : _ _ _utf8 ( b , s , e ) ; } ;
_ _toBuffer = function ( bufs ) { return ( bufs [ 0 ] . length > 0 && Buffer . isBuffer ( bufs [ 0 ] [ 0 ] ) ) ? Buffer . concat ( bufs [ 0 ] ) : _ _ _toBuffer ( bufs ) ; } ;
bconcat = function ( bufs ) { return Buffer . isBuffer ( bufs [ 0 ] ) ? Buffer . concat ( bufs ) : [ ] . concat . apply ( [ ] , bufs ) ; } ;
_ _double = function double _ ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { if ( Buffer . isBuffer ( b ) /*::&& b instanceof Buffer*/ ) return b . readDoubleLE ( i ) ; return _ _ _double ( b , i ) ; } ;
is _buf = function is _buf _b ( a ) { return Buffer . isBuffer ( a ) || Array . isArray ( a ) ; } ;
}
/* from js-xls */
if ( typeof cptable !== 'undefined' ) {
_ _utf16le = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { return cptable . utils . decode ( 1200 , b . slice ( s , e ) ) . replace ( chr0 , '' ) ; } ;
_ _utf8 = function ( b /*:RawBytes|CFBlob*/ , s /*:number*/ , e /*:number*/ ) { return cptable . utils . decode ( 65001 , b . slice ( s , e ) ) ; } ;
_ _lpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( current _ansi , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
_ _cpstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( current _codepage , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
_ _lpwstr = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = 2 * _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( 1200 , b . slice ( i + 4 , i + 4 + len - 1 ) ) : "" ; } ;
_ _lpp4 = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( 1200 , b . slice ( i + 4 , i + 4 + len ) ) : "" ; } ;
_ _8lpp4 = function ( b /*:RawBytes|CFBlob*/ , i /*:number*/ ) { var len = _ _readUInt32LE ( b , i ) ; return len > 0 ? cptable . utils . decode ( 65001 , b . slice ( i + 4 , i + 4 + len ) ) : "" ; } ;
}
var _ _readUInt8 = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return b [ idx ] ; } ;
var _ _readUInt16LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return ( b [ idx + 1 ] * ( 1 << 8 ) ) + b [ idx ] ; } ;
var _ _readInt16LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { var u = ( b [ idx + 1 ] * ( 1 << 8 ) ) + b [ idx ] ; return ( u < 0x8000 ) ? u : ( ( 0xffff - u + 1 ) * - 1 ) ; } ;
var _ _readUInt32LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return b [ idx + 3 ] * ( 1 << 24 ) + ( b [ idx + 2 ] << 16 ) + ( b [ idx + 1 ] << 8 ) + b [ idx ] ; } ;
var _ _readInt32LE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return ( b [ idx + 3 ] << 24 ) | ( b [ idx + 2 ] << 16 ) | ( b [ idx + 1 ] << 8 ) | b [ idx ] ; } ;
var _ _readInt32BE = function ( b /*:RawBytes|CFBlob*/ , idx /*:number*/ ) /*:number*/ { return ( b [ idx ] << 24 ) | ( b [ idx + 1 ] << 16 ) | ( b [ idx + 2 ] << 8 ) | b [ idx + 3 ] ; } ;
function ReadShift ( size /*:number*/ , t /*:?string*/ ) /*:number|string*/ {
var o = "" , oI /*:: :number = 0*/ , oR , oo = [ ] , w , vv , i , loc ;
switch ( t ) {
case 'dbcs' :
loc = this . l ;
if ( has _buf && Buffer . isBuffer ( this ) ) o = this . slice ( this . l , this . l + 2 * size ) . toString ( "utf16le" ) ;
else for ( i = 0 ; i < size ; ++ i ) { o += String . fromCharCode ( _ _readUInt16LE ( this , loc ) ) ; loc += 2 ; }
size *= 2 ;
break ;
case 'utf8' : o = _ _utf8 ( this , this . l , this . l + size ) ; break ;
case 'utf16le' : size *= 2 ; o = _ _utf16le ( this , this . l , this . l + size ) ; break ;
case 'wstr' :
if ( typeof cptable !== 'undefined' ) o = cptable . utils . decode ( current _codepage , this . slice ( this . l , this . l + 2 * size ) ) ;
else return ReadShift . call ( this , size , 'dbcs' ) ;
size = 2 * size ; break ;
/* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */
case 'lpstr-ansi' : o = _ _lpstr ( this , this . l ) ; size = 4 + _ _readUInt32LE ( this , this . l ) ; break ;
case 'lpstr-cp' : o = _ _cpstr ( this , this . l ) ; size = 4 + _ _readUInt32LE ( this , this . l ) ; break ;
/* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */
case 'lpwstr' : o = _ _lpwstr ( this , this . l ) ; size = 4 + 2 * _ _readUInt32LE ( this , this . l ) ; break ;
/* [MS-OFFCRYPTO] 2.1.2 Length-Prefixed Padded Unicode String (UNICODE-LP-P4) */
case 'lpp4' : size = 4 + _ _readUInt32LE ( this , this . l ) ; o = _ _lpp4 ( this , this . l ) ; if ( size & 0x02 ) size += 2 ; break ;
/* [MS-OFFCRYPTO] 2.1.3 Length-Prefixed UTF-8 String (UTF-8-LP-P4) */
case '8lpp4' : size = 4 + _ _readUInt32LE ( this , this . l ) ; o = _ _8lpp4 ( this , this . l ) ; if ( size & 0x03 ) size += 4 - ( size & 0x03 ) ; break ;
case 'cstr' : size = 0 ; o = "" ;
while ( ( w = _ _readUInt8 ( this , this . l + size ++ ) ) !== 0 ) oo . push ( _getchar ( w ) ) ;
o = oo . join ( "" ) ; break ;
case '_wstr' : size = 0 ; o = "" ;
while ( ( w = _ _readUInt16LE ( this , this . l + size ) ) !== 0 ) { oo . push ( _getchar ( w ) ) ; size += 2 ; }
size += 2 ; o = oo . join ( "" ) ; break ;
/* sbcs and dbcs support continue records in the SST way TODO codepages */
case 'dbcs-cont' : o = "" ; loc = this . l ;
for ( i = 0 ; i < size ; ++ i ) {
if ( this . lens && this . lens . indexOf ( loc ) !== - 1 ) {
w = _ _readUInt8 ( this , loc ) ;
this . l = loc + 1 ;
vv = ReadShift . call ( this , size - i , w ? 'dbcs-cont' : 'sbcs-cont' ) ;
return oo . join ( "" ) + vv ;
}
oo . push ( _getchar ( _ _readUInt16LE ( this , loc ) ) ) ;
loc += 2 ;
} o = oo . join ( "" ) ; size *= 2 ; break ;
case 'cpstr' :
if ( typeof cptable !== 'undefined' ) {
o = cptable . utils . decode ( current _codepage , this . slice ( this . l , this . l + size ) ) ;
break ;
}
/* falls through */
case 'sbcs-cont' : o = "" ; loc = this . l ;
for ( i = 0 ; i != size ; ++ i ) {
if ( this . lens && this . lens . indexOf ( loc ) !== - 1 ) {
w = _ _readUInt8 ( this , loc ) ;
this . l = loc + 1 ;
vv = ReadShift . call ( this , size - i , w ? 'dbcs-cont' : 'sbcs-cont' ) ;
return oo . join ( "" ) + vv ;
}
oo . push ( _getchar ( _ _readUInt8 ( this , loc ) ) ) ;
loc += 1 ;
} o = oo . join ( "" ) ; break ;
default :
switch ( size ) {
case 1 : oI = _ _readUInt8 ( this , this . l ) ; this . l ++ ; return oI ;
case 2 : oI = ( t === 'i' ? _ _readInt16LE : _ _readUInt16LE ) ( this , this . l ) ; this . l += 2 ; return oI ;
case 4 : case - 4 :
if ( t === 'i' || ( ( this [ this . l + 3 ] & 0x80 ) === 0 ) ) { oI = ( ( size > 0 ) ? _ _readInt32LE : _ _readInt32BE ) ( this , this . l ) ; this . l += 4 ; return oI ; }
else { oR = _ _readUInt32LE ( this , this . l ) ; this . l += 4 ; } return oR ;
case 8 : case - 8 :
if ( t === 'f' ) {
if ( size == 8 ) oR = _ _double ( this , this . l ) ;
else oR = _ _double ( [ this [ this . l + 7 ] , this [ this . l + 6 ] , this [ this . l + 5 ] , this [ this . l + 4 ] , this [ this . l + 3 ] , this [ this . l + 2 ] , this [ this . l + 1 ] , this [ this . l + 0 ] ] , 0 ) ;
this . l += 8 ; return oR ;
} else size = 8 ;
/* falls through */
case 16 : o = _ _hexlify ( this , this . l , size ) ; break ;
} }
this . l += size ; return o ;
}
var _ _writeUInt32LE = function ( b /*:RawBytes|CFBlob*/ , val /*:number*/ , idx /*:number*/ ) /*:void*/ { b [ idx ] = ( val & 0xFF ) ; b [ idx + 1 ] = ( ( val >>> 8 ) & 0xFF ) ; b [ idx + 2 ] = ( ( val >>> 16 ) & 0xFF ) ; b [ idx + 3 ] = ( ( val >>> 24 ) & 0xFF ) ; } ;
var _ _writeInt32LE = function ( b /*:RawBytes|CFBlob*/ , val /*:number*/ , idx /*:number*/ ) /*:void*/ { b [ idx ] = ( val & 0xFF ) ; b [ idx + 1 ] = ( ( val >> 8 ) & 0xFF ) ; b [ idx + 2 ] = ( ( val >> 16 ) & 0xFF ) ; b [ idx + 3 ] = ( ( val >> 24 ) & 0xFF ) ; } ;
var _ _writeUInt16LE = function ( b /*:RawBytes|CFBlob*/ , val /*:number*/ , idx /*:number*/ ) /*:void*/ { b [ idx ] = ( val & 0xFF ) ; b [ idx + 1 ] = ( ( val >>> 8 ) & 0xFF ) ; } ;
function WriteShift ( t /*:number*/ , val /*:string|number*/ , f /*:?string*/ ) /*:any*/ {
var size = 0 , i = 0 ;
if ( f === 'dbcs' ) {
/*:: if(typeof val !== 'string') throw new Error("unreachable"); */
for ( i = 0 ; i != val . length ; ++ i ) _ _writeUInt16LE ( this , val . charCodeAt ( i ) , this . l + 2 * i ) ;
size = 2 * val . length ;
} else if ( f === 'sbcs' ) {
if ( typeof cptable !== 'undefined' && current _ansi == 874 ) {
/* TODO: use tables directly, don't encode */
/*:: if(typeof val !== "string") throw new Error("unreachable"); */
for ( i = 0 ; i != val . length ; ++ i ) {
var cppayload = cptable . utils . encode ( current _ansi , val . charAt ( i ) ) ;
this [ this . l + i ] = cppayload [ 0 ] ;
}
} else {
/*:: if(typeof val !== 'string') throw new Error("unreachable"); */
val = val . replace ( /[^\x00-\x7F]/g , "_" ) ;
/*:: if(typeof val !== 'string') throw new Error("unreachable"); */
for ( i = 0 ; i != val . length ; ++ i ) this [ this . l + i ] = ( val . charCodeAt ( i ) & 0xFF ) ;
}
size = val . length ;
} else if ( f === 'hex' ) {
for ( ; i < t ; ++ i ) {
/*:: if(typeof val !== "string") throw new Error("unreachable"); */
this [ this . l ++ ] = ( parseInt ( val . slice ( 2 * i , 2 * i + 2 ) , 16 ) || 0 ) ;
} return this ;
} else if ( f === 'utf16le' ) {
/*:: if(typeof val !== "string") throw new Error("unreachable"); */
var end /*:number*/ = Math . min ( this . l + t , this . length ) ;
for ( i = 0 ; i < Math . min ( val . length , t ) ; ++ i ) {
var cc = val . charCodeAt ( i ) ;
this [ this . l ++ ] = ( cc & 0xff ) ;
this [ this . l ++ ] = ( cc >> 8 ) ;
}
while ( this . l < end ) this [ this . l ++ ] = 0 ;
return this ;
} else /*:: if(typeof val === 'number') */ switch ( t ) {
case 1 : size = 1 ; this [ this . l ] = val & 0xFF ; break ;
case 2 : size = 2 ; this [ this . l ] = val & 0xFF ; val >>>= 8 ; this [ this . l + 1 ] = val & 0xFF ; break ;
case 3 : size = 3 ; this [ this . l ] = val & 0xFF ; val >>>= 8 ; this [ this . l + 1 ] = val & 0xFF ; val >>>= 8 ; this [ this . l + 2 ] = val & 0xFF ; break ;
case 4 : size = 4 ; _ _writeUInt32LE ( this , val , this . l ) ; break ;
case 8 : size = 8 ; if ( f === 'f' ) { write _double _le ( this , val , this . l ) ; break ; }
/* falls through */
case 16 : break ;
case - 4 : size = 4 ; _ _writeInt32LE ( this , val , this . l ) ; break ;
}
this . l += size ; return this ;
}
function CheckField ( hexstr /*:string*/ , fld /*:string*/ ) /*:void*/ {
var m = _ _hexlify ( this , this . l , hexstr . length >> 1 ) ;
if ( m !== hexstr ) throw new Error ( fld + 'Expected ' + hexstr + ' saw ' + m ) ;
this . l += hexstr . length >> 1 ;
}
function prep _blob ( blob , pos /*:number*/ ) /*:void*/ {
blob . l = pos ;
blob . read _shift = /*::(*/ ReadShift /*:: :any)*/ ;
blob . chk = CheckField ;
blob . write _shift = WriteShift ;
}
function parsenoop ( blob , length /*:: :number, opts?:any */ ) { blob . l += length ; }
function new _buf ( sz /*:number*/ ) /*:Block*/ {
var o = new _raw _buf ( sz ) ;
prep _blob ( o , 0 ) ;
return o ;
}
/* [MS-XLSB] 2.1.4 Record */
function recordhopper ( data , cb /*:RecordHopperCB*/ , opts /*:?any*/ ) {
if ( ! data ) return ;
var tmpbyte , cntbyte , length ;
prep _blob ( data , data . l || 0 ) ;
var L = data . length , RT = 0 , tgt = 0 ;
while ( data . l < L ) {
RT = data . read _shift ( 1 ) ;
if ( RT & 0x80 ) RT = ( RT & 0x7F ) + ( ( data . read _shift ( 1 ) & 0x7F ) << 7 ) ;
var R = XLSBRecordEnum [ RT ] || XLSBRecordEnum [ 0xFFFF ] ;
tmpbyte = data . read _shift ( 1 ) ;
length = tmpbyte & 0x7F ;
for ( cntbyte = 1 ; cntbyte < 4 && ( tmpbyte & 0x80 ) ; ++ cntbyte ) length += ( ( tmpbyte = data . read _shift ( 1 ) ) & 0x7F ) << ( 7 * cntbyte ) ;
tgt = data . l + length ;
var d = ( R . f || parsenoop ) ( data , length , opts ) ;
data . l = tgt ;
if ( cb ( d , R . n , RT ) ) return ;
}
}
/* control buffer usage for fixed-length buffers */
function buf _array ( ) /*:BufArray*/ {
var bufs /*:Array<Block>*/ = [ ] , blksz = has _buf ? 256 : 2048 ;
var newblk = function ba _newblk ( sz /*:number*/ ) /*:Block*/ {
var o /*:Block*/ = ( new _buf ( sz ) /*:any*/ ) ;
prep _blob ( o , 0 ) ;
return o ;
} ;
var curbuf /*:Block*/ = newblk ( blksz ) ;
var endbuf = function ba _endbuf ( ) {
if ( ! curbuf ) return ;
if ( curbuf . length > curbuf . l ) { curbuf = curbuf . slice ( 0 , curbuf . l ) ; curbuf . l = curbuf . length ; }
if ( curbuf . length > 0 ) bufs . push ( curbuf ) ;
curbuf = null ;
} ;
var next = function ba _next ( sz /*:number*/ ) /*:Block*/ {
if ( curbuf && ( sz < ( curbuf . length - curbuf . l ) ) ) return curbuf ;
endbuf ( ) ;
return ( curbuf = newblk ( Math . max ( sz + 1 , blksz ) ) ) ;
} ;
var end = function ba _end ( ) {
endbuf ( ) ;
return _ _toBuffer ( [ bufs ] ) ;
} ;
var push = function ba _push ( buf ) { endbuf ( ) ; curbuf = buf ; if ( curbuf . l == null ) curbuf . l = curbuf . length ; next ( blksz ) ; } ;
return ( { next : next , push : push , end : end , _bufs : bufs } /*:any*/ ) ;
}
function write _record ( ba /*:BufArray*/ , type /*:string*/ , payload , length /*:?number*/ ) {
var t /*:number*/ = + XLSBRE [ type ] , l ;
if ( isNaN ( t ) ) return ; // TODO: throw something here?
if ( ! length ) length = XLSBRecordEnum [ t ] . p || ( payload || [ ] ) . length || 0 ;
l = 1 + ( t >= 0x80 ? 1 : 0 ) + 1 /* + length*/ ;
if ( length >= 0x80 ) ++ l ; if ( length >= 0x4000 ) ++ l ; if ( length >= 0x200000 ) ++ l ;
var o = ba . next ( l ) ;
if ( t <= 0x7F ) o . write _shift ( 1 , t ) ;
else {
o . write _shift ( 1 , ( t & 0x7F ) + 0x80 ) ;
o . write _shift ( 1 , ( t >> 7 ) ) ;
}
for ( var i = 0 ; i != 4 ; ++ i ) {
if ( length >= 0x80 ) { o . write _shift ( 1 , ( length & 0x7F ) + 0x80 ) ; length >>= 7 ; }
else { o . write _shift ( 1 , length ) ; break ; }
}
if ( /*:: length != null &&*/ length > 0 && is _buf ( payload ) ) ba . push ( payload ) ;
}
/* XLS ranges enforced */
function shift _cell _xls ( cell /*:CellAddress*/ , tgt /*:any*/ , opts /*:?any*/ ) /*:CellAddress*/ {
var out = dup ( cell ) ;
if ( tgt . s ) {
if ( out . cRel ) out . c += tgt . s . c ;
if ( out . rRel ) out . r += tgt . s . r ;
} else {
if ( out . cRel ) out . c += tgt . c ;
if ( out . rRel ) out . r += tgt . r ;
}
if ( ! opts || opts . biff < 12 ) {
while ( out . c >= 0x100 ) out . c -= 0x100 ;
while ( out . r >= 0x10000 ) out . r -= 0x10000 ;
}
return out ;
}
function shift _range _xls ( cell , range , opts ) {
var out = dup ( cell ) ;
out . s = shift _cell _xls ( out . s , range . s , opts ) ;
out . e = shift _cell _xls ( out . e , range . s , opts ) ;
return out ;
}
function encode _cell _xls ( c /*:CellAddress*/ , biff /*:number*/ ) /*:string*/ {
if ( c . cRel && c . c < 0 ) { c = dup ( c ) ; while ( c . c < 0 ) c . c += ( biff > 8 ) ? 0x4000 : 0x100 ; }
if ( c . rRel && c . r < 0 ) { c = dup ( c ) ; while ( c . r < 0 ) c . r += ( biff > 8 ) ? 0x100000 : ( ( biff > 5 ) ? 0x10000 : 0x4000 ) ; }
var s = encode _cell ( c ) ;
if ( ! c . cRel && c . cRel != null ) s = fix _col ( s ) ;
if ( ! c . rRel && c . rRel != null ) s = fix _row ( s ) ;
return s ;
}
function encode _range _xls ( r , opts ) /*:string*/ {
if ( r . s . r == 0 && ! r . s . rRel ) {
if ( r . e . r == ( opts . biff >= 12 ? 0xFFFFF : ( opts . biff >= 8 ? 0x10000 : 0x4000 ) ) && ! r . e . rRel ) {
return ( r . s . cRel ? "" : "$" ) + encode _col ( r . s . c ) + ":" + ( r . e . cRel ? "" : "$" ) + encode _col ( r . e . c ) ;
}
}
if ( r . s . c == 0 && ! r . s . cRel ) {
if ( r . e . c == ( opts . biff >= 12 ? 0x3FFF : 0xFF ) && ! r . e . cRel ) {
return ( r . s . rRel ? "" : "$" ) + encode _row ( r . s . r ) + ":" + ( r . e . rRel ? "" : "$" ) + encode _row ( r . e . r ) ;
}
}
return encode _cell _xls ( r . s , opts . biff ) + ":" + encode _cell _xls ( r . e , opts . biff ) ;
}
function decode _row ( rowstr /*:string*/ ) /*:number*/ { return parseInt ( unfix _row ( rowstr ) , 10 ) - 1 ; }
function encode _row ( row /*:number*/ ) /*:string*/ { return "" + ( row + 1 ) ; }
function fix _row ( cstr /*:string*/ ) /*:string*/ { return cstr . replace ( /([A-Z]|^)(\d+)$/ , "$1$$$2" ) ; }
function unfix _row ( cstr /*:string*/ ) /*:string*/ { return cstr . replace ( /\$(\d+)$/ , "$1" ) ; }
function decode _col ( colstr /*:string*/ ) /*:number*/ { var c = unfix _col ( colstr ) , d = 0 , i = 0 ; for ( ; i !== c . length ; ++ i ) d = 26 * d + c . charCodeAt ( i ) - 64 ; return d - 1 ; }
function encode _col ( col /*:number*/ ) /*:string*/ { if ( col < 0 ) throw new Error ( "invalid column " + col ) ; var s = "" ; for ( ++ col ; col ; col = Math . floor ( ( col - 1 ) / 26 ) ) s = String . fromCharCode ( ( ( col - 1 ) % 26 ) + 65 ) + s ; return s ; }
function fix _col ( cstr /*:string*/ ) /*:string*/ { return cstr . replace ( /^([A-Z])/ , "$$$1" ) ; }
function unfix _col ( cstr /*:string*/ ) /*:string*/ { return cstr . replace ( /^\$([A-Z])/ , "$1" ) ; }
function split _cell ( cstr /*:string*/ ) /*:Array<string>*/ { return cstr . replace ( /(\$?[A-Z]*)(\$?\d*)/ , "$1,$2" ) . split ( "," ) ; }
//function decode_cell(cstr/*:string*/)/*:CellAddress*/ { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }
function decode _cell ( cstr /*:string*/ ) /*:CellAddress*/ {
var R = 0 , C = 0 ;
for ( var i = 0 ; i < cstr . length ; ++ i ) {
var cc = cstr . charCodeAt ( i ) ;
if ( cc >= 48 && cc <= 57 ) R = 10 * R + ( cc - 48 ) ;
else if ( cc >= 65 && cc <= 90 ) C = 26 * C + ( cc - 64 ) ;
}
return { c : C - 1 , r : R - 1 } ;
}
//function encode_cell(cell/*:CellAddress*/)/*:string*/ { return encode_col(cell.c) + encode_row(cell.r); }
function encode _cell ( cell /*:CellAddress*/ ) /*:string*/ {
var col = cell . c + 1 ;
var s = "" ;
for ( ; col ; col = ( ( col - 1 ) / 26 ) | 0 ) s = String . fromCharCode ( ( ( col - 1 ) % 26 ) + 65 ) + s ;
return s + ( cell . r + 1 ) ;
}
function decode _range ( range /*:string*/ ) /*:Range*/ {
var idx = range . indexOf ( ":" ) ;
if ( idx == - 1 ) return { s : decode _cell ( range ) , e : decode _cell ( range ) } ;
return { s : decode _cell ( range . slice ( 0 , idx ) ) , e : decode _cell ( range . slice ( idx + 1 ) ) } ;
}
/*# if only one arg, it is assumed to be a Range. If 2 args, both are cell addresses */
function encode _range ( cs /*:CellAddrSpec|Range*/ , ce /*:?CellAddrSpec*/ ) /*:string*/ {
if ( typeof ce === 'undefined' || typeof ce === 'number' ) {
/*:: if(!(cs instanceof Range)) throw "unreachable"; */
return encode _range ( cs . s , cs . e ) ;
}
/*:: if((cs instanceof Range)) throw "unreachable"; */
if ( typeof cs !== 'string' ) cs = encode _cell ( ( cs /*:any*/ ) ) ;
if ( typeof ce !== 'string' ) ce = encode _cell ( ( ce /*:any*/ ) ) ;
/*:: if(typeof cs !== 'string') throw "unreachable"; */
/*:: if(typeof ce !== 'string') throw "unreachable"; */
return cs == ce ? cs : cs + ":" + ce ;
}
function safe _decode _range ( range /*:string*/ ) /*:Range*/ {
var o = { s : { c : 0 , r : 0 } , e : { c : 0 , r : 0 } } ;
var idx = 0 , i = 0 , cc = 0 ;
var len = range . length ;
for ( idx = 0 ; i < len ; ++ i ) {
if ( ( cc = range . charCodeAt ( i ) - 64 ) < 1 || cc > 26 ) break ;
idx = 26 * idx + cc ;
}
o . s . c = -- idx ;
for ( idx = 0 ; i < len ; ++ i ) {
if ( ( cc = range . charCodeAt ( i ) - 48 ) < 0 || cc > 9 ) break ;
idx = 10 * idx + cc ;
}
o . s . r = -- idx ;
if ( i === len || range . charCodeAt ( ++ i ) === 58 ) { o . e . c = o . s . c ; o . e . r = o . s . r ; return o ; }
for ( idx = 0 ; i != len ; ++ i ) {
if ( ( cc = range . charCodeAt ( i ) - 64 ) < 1 || cc > 26 ) break ;
idx = 26 * idx + cc ;
}
o . e . c = -- idx ;
for ( idx = 0 ; i != len ; ++ i ) {
if ( ( cc = range . charCodeAt ( i ) - 48 ) < 0 || cc > 9 ) break ;
idx = 10 * idx + cc ;
}
o . e . r = -- idx ;
return o ;
}
function safe _format _cell ( cell /*:Cell*/ , v /*:any*/ ) {
var q = ( cell . t == 'd' && v instanceof Date ) ;
if ( cell . z != null ) try { return ( cell . w = SSF . format ( cell . z , q ? datenum ( v ) : v ) ) ; } catch ( e ) { }
try { return ( cell . w = SSF . format ( ( cell . XF || { } ) . numFmtId || ( q ? 14 : 0 ) , q ? datenum ( v ) : v ) ) ; } catch ( e ) { return '' + v ; }
}
function format _cell ( cell /*:Cell*/ , v /*:any*/ , o /*:any*/ ) {
if ( cell == null || cell . t == null || cell . t == 'z' ) return "" ;
if ( cell . w !== undefined ) return cell . w ;
if ( cell . t == 'd' && ! cell . z && o && o . dateNF ) cell . z = o . dateNF ;
2021-10-13 07:20:25 +00:00
if ( cell . t == "e" ) return BErr [ cell . v ] || cell . v ;
2021-09-12 11:11:48 +00:00
if ( v == undefined ) return safe _format _cell ( cell , cell . v ) ;
return safe _format _cell ( cell , v ) ;
}
function sheet _to _workbook ( sheet /*:Worksheet*/ , opts ) /*:Workbook*/ {
var n = opts && opts . sheet ? opts . sheet : "Sheet1" ;
var sheets = { } ; sheets [ n ] = sheet ;
return { SheetNames : [ n ] , Sheets : sheets } ;
}
function sheet _add _aoa ( _ws /*:?Worksheet*/ , data /*:AOA*/ , opts /*:?any*/ ) /*:Worksheet*/ {
var o = opts || { } ;
var dense = _ws ? Array . isArray ( _ws ) : o . dense ;
if ( DENSE != null && dense == null ) dense = DENSE ;
var ws /*:Worksheet*/ = _ws || ( dense ? ( [ ] /*:any*/ ) : ( { } /*:any*/ ) ) ;
var _R = 0 , _C = 0 ;
if ( ws && o . origin != null ) {
if ( typeof o . origin == 'number' ) _R = o . origin ;
else {
var _origin /*:CellAddress*/ = typeof o . origin == "string" ? decode _cell ( o . origin ) : o . origin ;
_R = _origin . r ; _C = _origin . c ;
}
if ( ! ws [ "!ref" ] ) ws [ "!ref" ] = "A1:A1" ;
}
var range /*:Range*/ = ( { s : { c : 10000000 , r : 10000000 } , e : { c : 0 , r : 0 } } /*:any*/ ) ;
if ( ws [ '!ref' ] ) {
var _range = safe _decode _range ( ws [ '!ref' ] ) ;
range . s . c = _range . s . c ;
range . s . r = _range . s . r ;
range . e . c = Math . max ( range . e . c , _range . e . c ) ;
range . e . r = Math . max ( range . e . r , _range . e . r ) ;
if ( _R == - 1 ) range . e . r = _R = _range . e . r + 1 ;
}
for ( var R = 0 ; R != data . length ; ++ R ) {
if ( ! data [ R ] ) continue ;
if ( ! Array . isArray ( data [ R ] ) ) throw new Error ( "aoa_to_sheet expects an array of arrays" ) ;
for ( var C = 0 ; C != data [ R ] . length ; ++ C ) {
if ( typeof data [ R ] [ C ] === 'undefined' ) continue ;
var cell /*:Cell*/ = ( { v : data [ R ] [ C ] } /*:any*/ ) ;
var _ _R = _R + R , _ _C = _C + C ;
if ( range . s . r > _ _R ) range . s . r = _ _R ;
if ( range . s . c > _ _C ) range . s . c = _ _C ;
if ( range . e . r < _ _R ) range . e . r = _ _R ;
if ( range . e . c < _ _C ) range . e . c = _ _C ;
if ( data [ R ] [ C ] && typeof data [ R ] [ C ] === 'object' && ! Array . isArray ( data [ R ] [ C ] ) && ! ( data [ R ] [ C ] instanceof Date ) ) cell = data [ R ] [ C ] ;
else {
if ( Array . isArray ( cell . v ) ) { cell . f = data [ R ] [ C ] [ 1 ] ; cell . v = cell . v [ 0 ] ; }
2021-10-13 07:20:25 +00:00
if ( cell . v === null ) {
if ( cell . f ) cell . t = 'n' ;
else if ( o . nullError ) { cell . t = 'e' ; cell . v = 0 ; }
else if ( ! o . sheetStubs ) continue ;
else cell . t = 'z' ;
}
2021-09-12 11:11:48 +00:00
else if ( typeof cell . v === 'number' ) cell . t = 'n' ;
else if ( typeof cell . v === 'boolean' ) cell . t = 'b' ;
else if ( cell . v instanceof Date ) {
cell . z = o . dateNF || SSF . _table [ 14 ] ;
if ( o . cellDates ) { cell . t = 'd' ; cell . w = SSF . format ( cell . z , datenum ( cell . v ) ) ; }
else { cell . t = 'n' ; cell . v = datenum ( cell . v ) ; cell . w = SSF . format ( cell . z , cell . v ) ; }
}
else cell . t = 's' ;
}
if ( dense ) {
if ( ! ws [ _ _R ] ) ws [ _ _R ] = [ ] ;
if ( ws [ _ _R ] [ _ _C ] && ws [ _ _R ] [ _ _C ] . z ) cell . z = ws [ _ _R ] [ _ _C ] . z ;
ws [ _ _R ] [ _ _C ] = cell ;
} else {
var cell _ref = encode _cell ( ( { c : _ _C , r : _ _R } /*:any*/ ) ) ;
if ( ws [ cell _ref ] && ws [ cell _ref ] . z ) cell . z = ws [ cell _ref ] . z ;
ws [ cell _ref ] = cell ;
}
}
}
if ( range . s . c < 10000000 ) ws [ '!ref' ] = encode _range ( range ) ;
return ws ;
}
function aoa _to _sheet ( data /*:AOA*/ , opts /*:?any*/ ) /*:Worksheet*/ { return sheet _add _aoa ( null , data , opts ) ; }
function write _UInt32LE ( x /*:number*/ , o ) {
if ( ! o ) o = new _buf ( 4 ) ;
o . write _shift ( 4 , x ) ;
return o ;
}
/* [MS-XLSB] 2.5.168 */
function parse _XLWideString ( data /*::, length*/ ) /*:string*/ {
var cchCharacters = data . read _shift ( 4 ) ;
return cchCharacters === 0 ? "" : data . read _shift ( cchCharacters , 'dbcs' ) ;
}
function write _XLWideString ( data /*:string*/ , o ) {
var _null = false ; if ( o == null ) { _null = true ; o = new _buf ( 4 + 2 * data . length ) ; }
o . write _shift ( 4 , data . length ) ;
if ( data . length > 0 ) o . write _shift ( 0 , data , 'dbcs' ) ;
return _null ? o . slice ( 0 , o . l ) : o ;
}
/* [MS-XLSB] 2.5.91 */
//function parse_LPWideString(data/*::, length*/)/*:string*/ {
// var cchCharacters = data.read_shift(2);
// return cchCharacters === 0 ? "" : data.read_shift(cchCharacters, "utf16le");
//}
/* [MS-XLSB] 2.5.143 */
function parse _StrRun ( data ) {
return { ich : data . read _shift ( 2 ) , ifnt : data . read _shift ( 2 ) } ;
}
function write _StrRun ( run , o ) {
if ( ! o ) o = new _buf ( 4 ) ;
o . write _shift ( 2 , run . ich || 0 ) ;
o . write _shift ( 2 , run . ifnt || 0 ) ;
return o ;
}
/* [MS-XLSB] 2.5.121 */
function parse _RichStr ( data , length /*:number*/ ) /*:XLString*/ {
var start = data . l ;
var flags = data . read _shift ( 1 ) ;
var str = parse _XLWideString ( data ) ;
var rgsStrRun = [ ] ;
var z = ( { t : str , h : str } /*:any*/ ) ;
if ( ( flags & 1 ) !== 0 ) { /* fRichStr */
/* TODO: formatted string */
var dwSizeStrRun = data . read _shift ( 4 ) ;
for ( var i = 0 ; i != dwSizeStrRun ; ++ i ) rgsStrRun . push ( parse _StrRun ( data ) ) ;
z . r = rgsStrRun ;
}
else z . r = [ { ich : 0 , ifnt : 0 } ] ;
//if((flags & 2) !== 0) { /* fExtStr */
// /* TODO: phonetic string */
//}
data . l = start + length ;
return z ;
}
function write _RichStr ( str /*:XLString*/ , o /*:?Block*/ ) /*:Block*/ {
/* TODO: formatted string */
var _null = false ; if ( o == null ) { _null = true ; o = new _buf ( 15 + 4 * str . t . length ) ; }
o . write _shift ( 1 , 0 ) ;
write _XLWideString ( str . t , o ) ;
return _null ? o . slice ( 0 , o . l ) : o ;
}
/* [MS-XLSB] 2.4.328 BrtCommentText (RichStr w/1 run) */
var parse _BrtCommentText = parse _RichStr ;
function write _BrtCommentText ( str /*:XLString*/ , o /*:?Block*/ ) /*:Block*/ {
/* TODO: formatted string */
var _null = false ; if ( o == null ) { _null = true ; o = new _buf ( 23 + 4 * str . t . length ) ; }
o . write _shift ( 1 , 1 ) ;
write _XLWideString ( str . t , o ) ;
o . write _shift ( 4 , 1 ) ;
write _StrRun ( { ich : 0 , ifnt : 0 } , o ) ;
return _null ? o . slice ( 0 , o . l ) : o ;
}
/* [MS-XLSB] 2.5.9 */
function parse _XLSBCell ( data ) /*:any*/ {
var col = data . read _shift ( 4 ) ;
var iStyleRef = data . read _shift ( 2 ) ;
iStyleRef += data . read _shift ( 1 ) << 16 ;
data . l ++ ; //var fPhShow = data.read_shift(1);
return { c : col , iStyleRef : iStyleRef } ;
}
function write _XLSBCell ( cell /*:any*/ , o /*:?Block*/ ) {
if ( o == null ) o = new _buf ( 8 ) ;
o . write _shift ( - 4 , cell . c ) ;
o . write _shift ( 3 , cell . iStyleRef || cell . s ) ;
o . write _shift ( 1 , 0 ) ; /* fPhShow */
return o ;
}
/* Short XLSB Cell does not include column */
function parse _XLSBShortCell ( data ) /*:any*/ {
var iStyleRef = data . read _shift ( 2 ) ;
iStyleRef += data . read _shift ( 1 ) << 16 ;
data . l ++ ; //var fPhShow = data.read_shift(1);
return { c : - 1 , iStyleRef : iStyleRef } ;
}
function write _XLSBShortCell ( cell /*:any*/ , o /*:?Block*/ ) {
if ( o == null ) o = new _buf ( 4 ) ;
o . write _shift ( 3 , cell . iStyleRef || cell . s ) ;
o . write _shift ( 1 , 0 ) ; /* fPhShow */
return o ;
}
/* [MS-XLSB] 2.5.21 */
var parse _XLSBCodeName = parse _XLWideString ;
var write _XLSBCodeName = write _XLWideString ;
/* [MS-XLSB] 2.5.166 */
function parse _XLNullableWideString ( data /*::, length*/ ) /*:string*/ {
var cchCharacters = data . read _shift ( 4 ) ;
return cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? "" : data . read _shift ( cchCharacters , 'dbcs' ) ;
}
function write _XLNullableWideString ( data /*:string*/ , o ) {
var _null = false ; if ( o == null ) { _null = true ; o = new _buf ( 127 ) ; }
o . write _shift ( 4 , data . length > 0 ? data . length : 0xFFFFFFFF ) ;
if ( data . length > 0 ) o . write _shift ( 0 , data , 'dbcs' ) ;
return _null ? o . slice ( 0 , o . l ) : o ;
}
/* [MS-XLSB] 2.5.165 */
var parse _XLNameWideString = parse _XLWideString ;
//var write_XLNameWideString = write_XLWideString;
/* [MS-XLSB] 2.5.114 */
var parse _RelID = parse _XLNullableWideString ;
var write _RelID = write _XLNullableWideString ;
/* [MS-XLS] 2.5.217 ; [MS-XLSB] 2.5.122 */
function parse _RkNumber ( data ) /*:number*/ {
var b = data . slice ( data . l , data . l + 4 ) ;
var fX100 = ( b [ 0 ] & 1 ) , fInt = ( b [ 0 ] & 2 ) ;
data . l += 4 ;
b [ 0 ] &= 0xFC ; // b[0] &= ~3;
var RK = fInt === 0 ? _ _double ( [ 0 , 0 , 0 , 0 , b [ 0 ] , b [ 1 ] , b [ 2 ] , b [ 3 ] ] , 0 ) : _ _readInt32LE ( b , 0 ) >> 2 ;
return fX100 ? ( RK / 100 ) : RK ;
}
function write _RkNumber ( data /*:number*/ , o ) {
if ( o == null ) o = new _buf ( 4 ) ;
var fX100 = 0 , fInt = 0 , d100 = data * 100 ;
if ( ( data == ( data | 0 ) ) && ( data >= - ( 1 << 29 ) ) && ( data < ( 1 << 29 ) ) ) { fInt = 1 ; }
else if ( ( d100 == ( d100 | 0 ) ) && ( d100 >= - ( 1 << 29 ) ) && ( d100 < ( 1 << 29 ) ) ) { fInt = 1 ; fX100 = 1 ; }
if ( fInt ) o . write _shift ( - 4 , ( ( fX100 ? d100 : data ) << 2 ) + ( fX100 + 2 ) ) ;
else throw new Error ( "unsupported RkNumber " + data ) ; // TODO
}
/* [MS-XLSB] 2.5.117 RfX */
function parse _RfX ( data /*::, length*/ ) /*:Range*/ {
var cell /*:Range*/ = ( { s : { } , e : { } } /*:any*/ ) ;
cell . s . r = data . read _shift ( 4 ) ;
cell . e . r = data . read _shift ( 4 ) ;
cell . s . c = data . read _shift ( 4 ) ;
cell . e . c = data . read _shift ( 4 ) ;
return cell ;
}
function write _RfX ( r /*:Range*/ , o ) {
if ( ! o ) o = new _buf ( 16 ) ;
o . write _shift ( 4 , r . s . r ) ;
o . write _shift ( 4 , r . e . r ) ;
o . write _shift ( 4 , r . s . c ) ;
o . write _shift ( 4 , r . e . c ) ;
return o ;
}
/* [MS-XLSB] 2.5.153 UncheckedRfX */
var parse _UncheckedRfX = parse _RfX ;
var write _UncheckedRfX = write _RfX ;
/* [MS-XLSB] 2.5.155 UncheckedSqRfX */
//function parse_UncheckedSqRfX(data) {
// var cnt = data.read_shift(4);
// var out = [];
// for(var i = 0; i < cnt; ++i) {
// var rng = parse_UncheckedRfX(data);
// out.push(encode_range(rng));
// }
// return out.join(",");
//}
//function write_UncheckedSqRfX(sqrfx/*:string*/) {
// var parts = sqrfx.split(/\s*,\s*/);
// var o = new_buf(4); o.write_shift(4, parts.length);
// var out = [o];
// parts.forEach(function(rng) {
// out.push(write_UncheckedRfX(safe_decode_range(rng)));
// });
// return bconcat(out);
//}
/* [MS-XLS] 2.5.342 ; [MS-XLSB] 2.5.171 */
/* TODO: error checking, NaN and Infinity values are not valid Xnum */
function parse _Xnum ( data /*::, length*/ ) {
if ( data . length - data . l < 8 ) throw "XLS Xnum Buffer underflow" ;
return data . read _shift ( 8 , 'f' ) ;
}
function write _Xnum ( data , o ) { return ( o || new _buf ( 8 ) ) . write _shift ( 8 , data , 'f' ) ; }
/* [MS-XLSB] 2.4.324 BrtColor */
function parse _BrtColor ( data /*::, length*/ ) {
var out = { } ;
var d = data . read _shift ( 1 ) ;
//var fValidRGB = d & 1;
var xColorType = d >>> 1 ;
var index = data . read _shift ( 1 ) ;
var nTS = data . read _shift ( 2 , 'i' ) ;
var bR = data . read _shift ( 1 ) ;
var bG = data . read _shift ( 1 ) ;
var bB = data . read _shift ( 1 ) ;
data . l ++ ; //var bAlpha = data.read_shift(1);
switch ( xColorType ) {
case 0 : out . auto = 1 ; break ;
case 1 :
out . index = index ;
var icv = XLSIcv [ index ] ;
/* automatic pseudo index 81 */
if ( icv ) out . rgb = rgb2Hex ( icv ) ;
break ;
case 2 :
/* if(!fValidRGB) throw new Error("invalid"); */
out . rgb = rgb2Hex ( [ bR , bG , bB ] ) ;
break ;
case 3 : out . theme = index ; break ;
}
if ( nTS != 0 ) out . tint = nTS > 0 ? nTS / 32767 : nTS / 32768 ;
return out ;
}
function write _BrtColor ( color , o ) {
if ( ! o ) o = new _buf ( 8 ) ;
if ( ! color || color . auto ) { o . write _shift ( 4 , 0 ) ; o . write _shift ( 4 , 0 ) ; return o ; }
if ( color . index != null ) {
o . write _shift ( 1 , 0x02 ) ;
o . write _shift ( 1 , color . index ) ;
} else if ( color . theme != null ) {
o . write _shift ( 1 , 0x06 ) ;
o . write _shift ( 1 , color . theme ) ;
} else {
o . write _shift ( 1 , 0x05 ) ;
o . write _shift ( 1 , 0 ) ;
}
var nTS = color . tint || 0 ;
if ( nTS > 0 ) nTS *= 32767 ;
else if ( nTS < 0 ) nTS *= 32768 ;
o . write _shift ( 2 , nTS ) ;
if ( ! color . rgb || color . theme != null ) {
o . write _shift ( 2 , 0 ) ;
o . write _shift ( 1 , 0 ) ;
o . write _shift ( 1 , 0 ) ;
} else {
var rgb = ( color . rgb || 'FFFFFF' ) ;
if ( typeof rgb == 'number' ) rgb = ( "000000" + rgb . toString ( 16 ) ) . slice ( - 6 ) ;
o . write _shift ( 1 , parseInt ( rgb . slice ( 0 , 2 ) , 16 ) ) ;
o . write _shift ( 1 , parseInt ( rgb . slice ( 2 , 4 ) , 16 ) ) ;
o . write _shift ( 1 , parseInt ( rgb . slice ( 4 , 6 ) , 16 ) ) ;
o . write _shift ( 1 , 0xFF ) ;
}
return o ;
}
/* [MS-XLSB] 2.5.52 */
function parse _FontFlags ( data /*::, length, opts*/ ) {
var d = data . read _shift ( 1 ) ;
data . l ++ ;
var out = {
fBold : d & 0x01 ,
fItalic : d & 0x02 ,
fUnderline : d & 0x04 ,
fStrikeout : d & 0x08 ,
fOutline : d & 0x10 ,
fShadow : d & 0x20 ,
fCondense : d & 0x40 ,
fExtend : d & 0x80
} ;
return out ;
}
function write _FontFlags ( font , o ) {
if ( ! o ) o = new _buf ( 2 ) ;
var grbit =
( font . italic ? 0x02 : 0 ) |
( font . strike ? 0x08 : 0 ) |
( font . outline ? 0x10 : 0 ) |
( font . shadow ? 0x20 : 0 ) |
( font . condense ? 0x40 : 0 ) |
( font . extend ? 0x80 : 0 ) ;
o . write _shift ( 1 , grbit ) ;
o . write _shift ( 1 , 0 ) ;
return o ;
}
/* [MS-OLEDS] 2.3.1 and 2.3.2 */
function parse _ClipboardFormatOrString ( o , w /*:number*/ ) /*:string*/ {
// $FlowIgnore
var ClipFmt = { 2 : "BITMAP" , 3 : "METAFILEPICT" , 8 : "DIB" , 14 : "ENHMETAFILE" } ;
var m /*:number*/ = o . read _shift ( 4 ) ;
switch ( m ) {
case 0x00000000 : return "" ;
case 0xffffffff : case 0xfffffffe : return ClipFmt [ o . read _shift ( 4 ) ] || "" ;
}
if ( m > 0x190 ) throw new Error ( "Unsupported Clipboard: " + m . toString ( 16 ) ) ;
o . l -= 4 ;
return o . read _shift ( 0 , w == 1 ? "lpstr" : "lpwstr" ) ;
}
function parse _ClipboardFormatOrAnsiString ( o ) { return parse _ClipboardFormatOrString ( o , 1 ) ; }
function parse _ClipboardFormatOrUnicodeString ( o ) { return parse _ClipboardFormatOrString ( o , 2 ) ; }
/* [MS-OLEPS] 2.2 PropertyType */
//var VT_EMPTY = 0x0000;
//var VT_NULL = 0x0001;
var VT _I2 = 0x0002 ;
var VT _I4 = 0x0003 ;
//var VT_R4 = 0x0004;
//var VT_R8 = 0x0005;
//var VT_CY = 0x0006;
//var VT_DATE = 0x0007;
//var VT_BSTR = 0x0008;
//var VT_ERROR = 0x000A;
var VT _BOOL = 0x000B ;
var VT _VARIANT = 0x000C ;
//var VT_DECIMAL = 0x000E;
//var VT_I1 = 0x0010;
//var VT_UI1 = 0x0011;
//var VT_UI2 = 0x0012;
var VT _UI4 = 0x0013 ;
//var VT_I8 = 0x0014;
//var VT_UI8 = 0x0015;
//var VT_INT = 0x0016;
//var VT_UINT = 0x0017;
var VT _LPSTR = 0x001E ;
//var VT_LPWSTR = 0x001F;
var VT _FILETIME = 0x0040 ;
var VT _BLOB = 0x0041 ;
//var VT_STREAM = 0x0042;
//var VT_STORAGE = 0x0043;
//var VT_STREAMED_Object = 0x0044;
//var VT_STORED_Object = 0x0045;
//var VT_BLOB_Object = 0x0046;
var VT _CF = 0x0047 ;
//var VT_CLSID = 0x0048;
//var VT_VERSIONED_STREAM = 0x0049;
var VT _VECTOR = 0x1000 ;
//var VT_ARRAY = 0x2000;
var VT _STRING = 0x0050 ; // 2.3.3.1.11 VtString
var VT _USTR = 0x0051 ; // 2.3.3.1.12 VtUnalignedString
var VT _CUSTOM = [ VT _STRING , VT _USTR ] ;
/* [MS-OSHARED] 2.3.3.2.2.1 Document Summary Information PIDDSI */
var DocSummaryPIDDSI = {
/*::[*/ 0x01 /*::]*/ : { n : 'CodePage' , t : VT _I2 } ,
/*::[*/ 0x02 /*::]*/ : { n : 'Category' , t : VT _STRING } ,
/*::[*/ 0x03 /*::]*/ : { n : 'PresentationFormat' , t : VT _STRING } ,
/*::[*/ 0x04 /*::]*/ : { n : 'ByteCount' , t : VT _I4 } ,
/*::[*/ 0x05 /*::]*/ : { n : 'LineCount' , t : VT _I4 } ,
/*::[*/ 0x06 /*::]*/ : { n : 'ParagraphCount' , t : VT _I4 } ,
/*::[*/ 0x07 /*::]*/ : { n : 'SlideCount' , t : VT _I4 } ,
/*::[*/ 0x08 /*::]*/ : { n : 'NoteCount' , t : VT _I4 } ,
/*::[*/ 0x09 /*::]*/ : { n : 'HiddenCount' , t : VT _I4 } ,
/*::[*/ 0x0a /*::]*/ : { n : 'MultimediaClipCount' , t : VT _I4 } ,
/*::[*/ 0x0b /*::]*/ : { n : 'ScaleCrop' , t : VT _BOOL } ,
/*::[*/ 0x0c /*::]*/ : { n : 'HeadingPairs' , t : VT _VECTOR | VT _VARIANT } ,
/*::[*/ 0x0d /*::]*/ : { n : 'TitlesOfParts' , t : VT _VECTOR | VT _LPSTR } ,
/*::[*/ 0x0e /*::]*/ : { n : 'Manager' , t : VT _STRING } ,
/*::[*/ 0x0f /*::]*/ : { n : 'Company' , t : VT _STRING } ,
/*::[*/ 0x10 /*::]*/ : { n : 'LinksUpToDate' , t : VT _BOOL } ,
/*::[*/ 0x11 /*::]*/ : { n : 'CharacterCount' , t : VT _I4 } ,
/*::[*/ 0x13 /*::]*/ : { n : 'SharedDoc' , t : VT _BOOL } ,
/*::[*/ 0x16 /*::]*/ : { n : 'HyperlinksChanged' , t : VT _BOOL } ,
/*::[*/ 0x17 /*::]*/ : { n : 'AppVersion' , t : VT _I4 , p : 'version' } ,
/*::[*/ 0x18 /*::]*/ : { n : 'DigSig' , t : VT _BLOB } ,
/*::[*/ 0x1A /*::]*/ : { n : 'ContentType' , t : VT _STRING } ,
/*::[*/ 0x1B /*::]*/ : { n : 'ContentStatus' , t : VT _STRING } ,
/*::[*/ 0x1C /*::]*/ : { n : 'Language' , t : VT _STRING } ,
/*::[*/ 0x1D /*::]*/ : { n : 'Version' , t : VT _STRING } ,
/*::[*/ 0xFF /*::]*/ : { }
} ;
/* [MS-OSHARED] 2.3.3.2.1.1 Summary Information Property Set PIDSI */
var SummaryPIDSI = {
/*::[*/ 0x01 /*::]*/ : { n : 'CodePage' , t : VT _I2 } ,
/*::[*/ 0x02 /*::]*/ : { n : 'Title' , t : VT _STRING } ,
/*::[*/ 0x03 /*::]*/ : { n : 'Subject' , t : VT _STRING } ,
/*::[*/ 0x04 /*::]*/ : { n : 'Author' , t : VT _STRING } ,
/*::[*/ 0x05 /*::]*/ : { n : 'Keywords' , t : VT _STRING } ,
/*::[*/ 0x06 /*::]*/ : { n : 'Comments' , t : VT _STRING } ,
/*::[*/ 0x07 /*::]*/ : { n : 'Template' , t : VT _STRING } ,
/*::[*/ 0x08 /*::]*/ : { n : 'LastAuthor' , t : VT _STRING } ,
/*::[*/ 0x09 /*::]*/ : { n : 'RevNumber' , t : VT _STRING } ,
/*::[*/ 0x0A /*::]*/ : { n : 'EditTime' , t : VT _FILETIME } ,
/*::[*/ 0x0B /*::]*/ : { n : 'LastPrinted' , t : VT _FILETIME } ,
/*::[*/ 0x0C /*::]*/ : { n : 'CreatedDate' , t : VT _FILETIME } ,
/*::[*/ 0x0D /*::]*/ : { n : 'ModifiedDate' , t : VT _FILETIME } ,
/*::[*/ 0x0E /*::]*/ : { n : 'PageCount' , t : VT _I4 } ,
/*::[*/ 0x0F /*::]*/ : { n : 'WordCount' , t : VT _I4 } ,
/*::[*/ 0x10 /*::]*/ : { n : 'CharCount' , t : VT _I4 } ,
/*::[*/ 0x11 /*::]*/ : { n : 'Thumbnail' , t : VT _CF } ,
/*::[*/ 0x12 /*::]*/ : { n : 'Application' , t : VT _STRING } ,
/*::[*/ 0x13 /*::]*/ : { n : 'DocSecurity' , t : VT _I4 } ,
/*::[*/ 0xFF /*::]*/ : { }
} ;
/* [MS-OLEPS] 2.18 */
var SpecialProperties = {
/*::[*/ 0x80000000 /*::]*/ : { n : 'Locale' , t : VT _UI4 } ,
/*::[*/ 0x80000003 /*::]*/ : { n : 'Behavior' , t : VT _UI4 } ,
/*::[*/ 0x72627262 /*::]*/ : { }
} ;
( function ( ) {
for ( var y in SpecialProperties ) if ( Object . prototype . hasOwnProperty . call ( SpecialProperties , y ) )
DocSummaryPIDDSI [ y ] = SummaryPIDSI [ y ] = SpecialProperties [ y ] ;
} ) ( ) ;
var DocSummaryRE /*:{[key:string]:string}*/ = evert _key ( DocSummaryPIDDSI , "n" ) ;
var SummaryRE /*:{[key:string]:string}*/ = evert _key ( SummaryPIDSI , "n" ) ;
/* [MS-XLS] 2.4.63 Country/Region codes */
var CountryEnum = {
/*::[*/ 0x0001 /*::]*/ : "US" , // United States
/*::[*/ 0x0002 /*::]*/ : "CA" , // Canada
/*::[*/ 0x0003 /*::]*/ : "" , // Latin America (except Brazil)
/*::[*/ 0x0007 /*::]*/ : "RU" , // Russia
/*::[*/ 0x0014 /*::]*/ : "EG" , // Egypt
/*::[*/ 0x001E /*::]*/ : "GR" , // Greece
/*::[*/ 0x001F /*::]*/ : "NL" , // Netherlands
/*::[*/ 0x0020 /*::]*/ : "BE" , // Belgium
/*::[*/ 0x0021 /*::]*/ : "FR" , // France
/*::[*/ 0x0022 /*::]*/ : "ES" , // Spain
/*::[*/ 0x0024 /*::]*/ : "HU" , // Hungary
/*::[*/ 0x0027 /*::]*/ : "IT" , // Italy
/*::[*/ 0x0029 /*::]*/ : "CH" , // Switzerland
/*::[*/ 0x002B /*::]*/ : "AT" , // Austria
/*::[*/ 0x002C /*::]*/ : "GB" , // United Kingdom
/*::[*/ 0x002D /*::]*/ : "DK" , // Denmark
/*::[*/ 0x002E /*::]*/ : "SE" , // Sweden
/*::[*/ 0x002F /*::]*/ : "NO" , // Norway
/*::[*/ 0x0030 /*::]*/ : "PL" , // Poland
/*::[*/ 0x0031 /*::]*/ : "DE" , // Germany
/*::[*/ 0x0034 /*::]*/ : "MX" , // Mexico
/*::[*/ 0x0037 /*::]*/ : "BR" , // Brazil
/*::[*/ 0x003d /*::]*/ : "AU" , // Australia
/*::[*/ 0x0040 /*::]*/ : "NZ" , // New Zealand
/*::[*/ 0x0042 /*::]*/ : "TH" , // Thailand
/*::[*/ 0x0051 /*::]*/ : "JP" , // Japan
/*::[*/ 0x0052 /*::]*/ : "KR" , // Korea
/*::[*/ 0x0054 /*::]*/ : "VN" , // Viet Nam
/*::[*/ 0x0056 /*::]*/ : "CN" , // China
/*::[*/ 0x005A /*::]*/ : "TR" , // Turkey
/*::[*/ 0x0069 /*::]*/ : "JS" , // Ramastan
/*::[*/ 0x00D5 /*::]*/ : "DZ" , // Algeria
/*::[*/ 0x00D8 /*::]*/ : "MA" , // Morocco
/*::[*/ 0x00DA /*::]*/ : "LY" , // Libya
/*::[*/ 0x015F /*::]*/ : "PT" , // Portugal
/*::[*/ 0x0162 /*::]*/ : "IS" , // Iceland
/*::[*/ 0x0166 /*::]*/ : "FI" , // Finland
/*::[*/ 0x01A4 /*::]*/ : "CZ" , // Czech Republic
/*::[*/ 0x0376 /*::]*/ : "TW" , // Taiwan
/*::[*/ 0x03C1 /*::]*/ : "LB" , // Lebanon
/*::[*/ 0x03C2 /*::]*/ : "JO" , // Jordan
/*::[*/ 0x03C3 /*::]*/ : "SY" , // Syria
/*::[*/ 0x03C4 /*::]*/ : "IQ" , // Iraq
/*::[*/ 0x03C5 /*::]*/ : "KW" , // Kuwait
/*::[*/ 0x03C6 /*::]*/ : "SA" , // Saudi Arabia
/*::[*/ 0x03CB /*::]*/ : "AE" , // United Arab Emirates
/*::[*/ 0x03CC /*::]*/ : "IL" , // Israel
/*::[*/ 0x03CE /*::]*/ : "QA" , // Qatar
/*::[*/ 0x03D5 /*::]*/ : "IR" , // Iran
/*::[*/ 0xFFFF /*::]*/ : "US" // United States
} ;
/* [MS-XLS] 2.5.127 */
var XLSFillPattern = [
null ,
'solid' ,
'mediumGray' ,
'darkGray' ,
'lightGray' ,
'darkHorizontal' ,
'darkVertical' ,
'darkDown' ,
'darkUp' ,
'darkGrid' ,
'darkTrellis' ,
'lightHorizontal' ,
'lightVertical' ,
'lightDown' ,
'lightUp' ,
'lightGrid' ,
'lightTrellis' ,
'gray125' ,
'gray0625'
] ;
function rgbify ( arr /*:Array<number>*/ ) /*:Array<[number, number, number]>*/ { return arr . map ( function ( x ) { return [ ( x >> 16 ) & 255 , ( x >> 8 ) & 255 , x & 255 ] ; } ) ; }
/* [MS-XLS] 2.5.161 */
/* [MS-XLSB] 2.5.75 Icv */
var _XLSIcv = rgbify ( [
/* Color Constants */
0x000000 ,
0xFFFFFF ,
0xFF0000 ,
0x00FF00 ,
0x0000FF ,
0xFFFF00 ,
0xFF00FF ,
0x00FFFF ,
/* Overridable Defaults */
0x000000 ,
0xFFFFFF ,
0xFF0000 ,
0x00FF00 ,
0x0000FF ,
0xFFFF00 ,
0xFF00FF ,
0x00FFFF ,
0x800000 ,
0x008000 ,
0x000080 ,
0x808000 ,
0x800080 ,
0x008080 ,
0xC0C0C0 ,
0x808080 ,
0x9999FF ,
0x993366 ,
0xFFFFCC ,
0xCCFFFF ,
0x660066 ,
0xFF8080 ,
0x0066CC ,
0xCCCCFF ,
0x000080 ,
0xFF00FF ,
0xFFFF00 ,
0x00FFFF ,
0x800080 ,
0x800000 ,
0x008080 ,
0x0000FF ,
0x00CCFF ,
0xCCFFFF ,
0xCCFFCC ,
0xFFFF99 ,
0x99CCFF ,
0xFF99CC ,
0xCC99FF ,
0xFFCC99 ,
0x3366FF ,
0x33CCCC ,
0x99CC00 ,
0xFFCC00 ,
0xFF9900 ,
0xFF6600 ,
0x666699 ,
0x969696 ,
0x003366 ,
0x339966 ,
0x003300 ,
0x333300 ,
0x993300 ,
0x993366 ,
0x333399 ,
0x333333 ,
/* Other entries to appease BIFF8/12 */
0xFFFFFF , /* 0x40 icvForeground ?? */
0x000000 , /* 0x41 icvBackground ?? */
0x000000 , /* 0x42 icvFrame ?? */
0x000000 , /* 0x43 icv3D ?? */
0x000000 , /* 0x44 icv3DText ?? */
0x000000 , /* 0x45 icv3DHilite ?? */
0x000000 , /* 0x46 icv3DShadow ?? */
0x000000 , /* 0x47 icvHilite ?? */
0x000000 , /* 0x48 icvCtlText ?? */
0x000000 , /* 0x49 icvCtlScrl ?? */
0x000000 , /* 0x4A icvCtlInv ?? */
0x000000 , /* 0x4B icvCtlBody ?? */
0x000000 , /* 0x4C icvCtlFrame ?? */
0x000000 , /* 0x4D icvCtlFore ?? */
0x000000 , /* 0x4E icvCtlBack ?? */
0x000000 , /* 0x4F icvCtlNeutral */
0x000000 , /* 0x50 icvInfoBk ?? */
0x000000 /* 0x51 icvInfoText ?? */
] ) ;
var XLSIcv = dup ( _XLSIcv ) ;
/* [MS-XLSB] 2.5.97.2 */
var BErr = {
/*::[*/ 0x00 /*::]*/ : "#NULL!" ,
/*::[*/ 0x07 /*::]*/ : "#DIV/0!" ,
/*::[*/ 0x0F /*::]*/ : "#VALUE!" ,
/*::[*/ 0x17 /*::]*/ : "#REF!" ,
/*::[*/ 0x1D /*::]*/ : "#NAME?" ,
/*::[*/ 0x24 /*::]*/ : "#NUM!" ,
/*::[*/ 0x2A /*::]*/ : "#N/A" ,
/*::[*/ 0x2B /*::]*/ : "#GETTING_DATA" ,
/*::[*/ 0xFF /*::]*/ : "#WTF?"
} ;
var RBErr = evert _num ( BErr ) ;
/* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */
/* 12.3 Part Summary <SpreadsheetML> */
/* 14.2 Part Summary <DrawingML> */
/* [MS-XLSX] 2.1 Part Enumerations ; [MS-XLSB] 2.1.7 Part Enumeration */
var ct2type /*{[string]:string}*/ = ( {
/* Workbook */
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" : "workbooks" ,
/* Worksheet */
"application/vnd.ms-excel.binIndexWs" : "TODO" , /* Binary Index */
/* Macrosheet */
"application/vnd.ms-excel.intlmacrosheet" : "TODO" ,
"application/vnd.ms-excel.binIndexMs" : "TODO" , /* Binary Index */
/* File Properties */
"application/vnd.openxmlformats-package.core-properties+xml" : "coreprops" ,
"application/vnd.openxmlformats-officedocument.custom-properties+xml" : "custprops" ,
"application/vnd.openxmlformats-officedocument.extended-properties+xml" : "extprops" ,
/* Custom Data Properties */
"application/vnd.openxmlformats-officedocument.customXmlProperties+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty" : "TODO" ,
/* PivotTable */
"application/vnd.ms-excel.pivotTable" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml" : "TODO" ,
/* Chart Objects */
"application/vnd.openxmlformats-officedocument.drawingml.chart+xml" : "TODO" ,
/* Chart Colors */
"application/vnd.ms-office.chartcolorstyle+xml" : "TODO" ,
/* Chart Style */
"application/vnd.ms-office.chartstyle+xml" : "TODO" ,
/* Chart Advanced */
"application/vnd.ms-office.chartex+xml" : "TODO" ,
/* Calculation Chain */
"application/vnd.ms-excel.calcChain" : "calcchains" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml" : "calcchains" ,
/* Printer Settings */
"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings" : "TODO" ,
/* ActiveX */
"application/vnd.ms-office.activeX" : "TODO" ,
"application/vnd.ms-office.activeX+xml" : "TODO" ,
/* Custom Toolbars */
"application/vnd.ms-excel.attachedToolbars" : "TODO" ,
/* External Data Connections */
"application/vnd.ms-excel.connections" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml" : "TODO" ,
/* External Links */
"application/vnd.ms-excel.externalLink" : "links" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml" : "links" ,
/* Metadata */
"application/vnd.ms-excel.sheetMetadata" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml" : "TODO" ,
/* PivotCache */
"application/vnd.ms-excel.pivotCacheDefinition" : "TODO" ,
"application/vnd.ms-excel.pivotCacheRecords" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml" : "TODO" ,
/* Query Table */
"application/vnd.ms-excel.queryTable" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml" : "TODO" ,
/* Shared Workbook */
"application/vnd.ms-excel.userNames" : "TODO" ,
"application/vnd.ms-excel.revisionHeaders" : "TODO" ,
"application/vnd.ms-excel.revisionLog" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml" : "TODO" ,
/* Single Cell Table */
"application/vnd.ms-excel.tableSingleCells" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml" : "TODO" ,
/* Slicer */
"application/vnd.ms-excel.slicer" : "TODO" ,
"application/vnd.ms-excel.slicerCache" : "TODO" ,
"application/vnd.ms-excel.slicer+xml" : "TODO" ,
"application/vnd.ms-excel.slicerCache+xml" : "TODO" ,
/* Sort Map */
"application/vnd.ms-excel.wsSortMap" : "TODO" ,
/* Table */
"application/vnd.ms-excel.table" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml" : "TODO" ,
/* Themes */
"application/vnd.openxmlformats-officedocument.theme+xml" : "themes" ,
/* Theme Override */
"application/vnd.openxmlformats-officedocument.themeOverride+xml" : "TODO" ,
/* Timeline */
"application/vnd.ms-excel.Timeline+xml" : "TODO" , /* verify */
"application/vnd.ms-excel.TimelineCache+xml" : "TODO" , /* verify */
/* VBA */
"application/vnd.ms-office.vbaProject" : "vba" ,
"application/vnd.ms-office.vbaProjectSignature" : "vba" ,
/* Volatile Dependencies */
"application/vnd.ms-office.volatileDependencies" : "TODO" ,
"application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml" : "TODO" ,
/* Control Properties */
"application/vnd.ms-excel.controlproperties+xml" : "TODO" ,
/* Data Model */
"application/vnd.openxmlformats-officedocument.model+data" : "TODO" ,
/* Survey */
"application/vnd.ms-excel.Survey+xml" : "TODO" ,
/* Drawing */
"application/vnd.openxmlformats-officedocument.drawing+xml" : "drawings" ,
"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml" : "TODO" ,
"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml" : "TODO" ,
/* VML */
"application/vnd.openxmlformats-officedocument.vmlDrawing" : "TODO" ,
"application/vnd.openxmlformats-package.relationships+xml" : "rels" ,
"application/vnd.openxmlformats-officedocument.oleObject" : "TODO" ,
/* Image */
"image/png" : "TODO" ,
"sheet" : "js"
} /*:any*/ ) ;
var CT _LIST = ( function ( ) {
var o = {
workbooks : {
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" ,
xlsm : "application/vnd.ms-excel.sheet.macroEnabled.main+xml" ,
xlsb : "application/vnd.ms-excel.sheet.binary.macroEnabled.main" ,
xlam : "application/vnd.ms-excel.addin.macroEnabled.main+xml" ,
xltx : "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
} ,
strs : { /* Shared Strings */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml" ,
xlsb : "application/vnd.ms-excel.sharedStrings"
} ,
comments : { /* Comments */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml" ,
xlsb : "application/vnd.ms-excel.comments"
} ,
sheets : { /* Worksheet */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" ,
xlsb : "application/vnd.ms-excel.worksheet"
} ,
charts : { /* Chartsheet */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml" ,
xlsb : "application/vnd.ms-excel.chartsheet"
} ,
dialogs : { /* Dialogsheet */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml" ,
xlsb : "application/vnd.ms-excel.dialogsheet"
} ,
macros : { /* Macrosheet (Excel 4.0 Macros) */
xlsx : "application/vnd.ms-excel.macrosheet+xml" ,
xlsb : "application/vnd.ms-excel.macrosheet"
} ,
styles : { /* Styles */
xlsx : "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" ,
xlsb : "application/vnd.ms-excel.styles"
}
} ;
keys ( o ) . forEach ( function ( k ) { [ "xlsm" , "xlam" ] . forEach ( function ( v ) { if ( ! o [ k ] [ v ] ) o [ k ] [ v ] = o [ k ] . xlsx ; } ) ; } ) ;
keys ( o ) . forEach ( function ( k ) { keys ( o [ k ] ) . forEach ( function ( v ) { ct2type [ o [ k ] [ v ] ] = k ; } ) ; } ) ;
return o ;
} ) ( ) ;
var type2ct /*{[string]:Array<string>}*/ = evert _arr ( ct2type ) ;
XMLNS . CT = 'http://schemas.openxmlformats.org/package/2006/content-types' ;
function new _ct ( ) /*:any*/ {
return ( {
workbooks : [ ] , sheets : [ ] , charts : [ ] , dialogs : [ ] , macros : [ ] ,
rels : [ ] , strs : [ ] , comments : [ ] , links : [ ] ,
coreprops : [ ] , extprops : [ ] , custprops : [ ] , themes : [ ] , styles : [ ] ,
calcchains : [ ] , vba : [ ] , drawings : [ ] ,
TODO : [ ] , xmlns : "" } /*:any*/ ) ;
}
function parse _ct ( data /*:?string*/ ) {