Skip to content

Commit

Permalink
Merge pull request #506 from unidoc-build/prep-rc-v1.29.1
Browse files Browse the repository at this point in the history
Release v1.29.1
  • Loading branch information
gunnsth authored Dec 29, 2023
2 parents 9fe3734 + 4f616b6 commit 378770e
Show file tree
Hide file tree
Showing 61 changed files with 57,394 additions and 57,402 deletions.
10 changes: 5 additions & 5 deletions algo/algo.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
// Use of this source code is governed by the UniDoc End User License Agreement
// terms that can be accessed at https://unidoc.io/eula/

package algo ;import _c "strconv";
package algo ;import _a "strconv";func _f (_af byte )bool {return _af >='0'&&_af <='9'};

// NaturalLess compares two strings in a human manner so rId2 sorts less than rId10
func NaturalLess (lhs ,rhs string )bool {_d ,_gae :=0,0;for _d < len (lhs )&&_gae < len (rhs ){_da :=lhs [_d ];_b :=rhs [_gae ];_e :=_ga (_da );_db :=_ga (_b );switch {case _e &&!_db :return true ;case !_e &&_db :return false ;case !_e &&!_db :if _da !=_b {return _da < _b ;
};_d ++;_gae ++;default:_ff :=_d +1;_bf :=_gae +1;for _ff < len (lhs )&&_ga (lhs [_ff ]){_ff ++;};for _bf < len (rhs )&&_ga (rhs [_bf ]){_bf ++;};_dac ,_ :=_c .ParseUint (lhs [_d :_ff ],10,64);_fff ,_ :=_c .ParseUint (rhs [_d :_bf ],10,64);if _dac !=_fff {return _dac < _fff ;
};_d =_ff ;_gae =_bf ;};};return len (lhs )< len (rhs );};func RepeatString (s string ,cnt int )string {if cnt <=0{return "";};_fg :=make ([]byte ,len (s )*cnt );_cf :=[]byte (s );for _bc :=0;_bc < cnt ;_bc ++{copy (_fg [_bc :],_cf );};return string (_fg );
};func _ga (_f byte )bool {return _f >='0'&&_f <='9'};
func NaturalLess (lhs ,rhs string )bool {_fb ,_dg :=0,0;for _fb < len (lhs )&&_dg < len (rhs ){_dd :=lhs [_fb ];_fa :=rhs [_dg ];_db :=_f (_dd );_fd :=_f (_fa );switch {case _db &&!_fd :return true ;case !_db &&_fd :return false ;case !_db &&!_fd :if _dd !=_fa {return _dd < _fa ;
};_fb ++;_dg ++;default:_b :=_fb +1;_fdf :=_dg +1;for _b < len (lhs )&&_f (lhs [_b ]){_b ++;};for _fdf < len (rhs )&&_f (rhs [_fdf ]){_fdf ++;};_c ,_ :=_a .ParseUint (lhs [_fb :_b ],10,64);_fad ,_ :=_a .ParseUint (rhs [_fb :_fdf ],10,64);if _c !=_fad {return _c < _fad ;
};_fb =_b ;_dg =_fdf ;};};return len (lhs )< len (rhs );};func RepeatString (s string ,cnt int )string {if cnt <=0{return "";};_aa :=make ([]byte ,len (s )*cnt );_g :=[]byte (s );for _fdfg :=0;_fdfg < cnt ;_fdfg ++{copy (_aa [_fdfg :],_g );};return string (_aa );
};
883 changes: 443 additions & 440 deletions chart/chart.go

Large diffs are not rendered by default.

78 changes: 39 additions & 39 deletions color/color.go

Large diffs are not rendered by default.

712 changes: 356 additions & 356 deletions common/axcontrol/axcontrol.go

Large diffs are not rendered by default.

705 changes: 353 additions & 352 deletions common/common.go

Large diffs are not rendered by default.

50 changes: 25 additions & 25 deletions common/license/license.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,40 +11,40 @@

// Package license helps manage commercial licenses and check if they
// are valid for the version of UniOffice used.
package license ;import _f "github.com/unidoc/unioffice/internal/license";
package license ;import _b "github.com/unidoc/unioffice/internal/license";

// SetLegacyLicenseKey installs a legacy license code. License codes issued prior to June 2019.
// Will be removed at some point in a future major version.
func SetLegacyLicenseKey (s string )error {return _b .SetLegacyLicenseKey (s )};

// SetMeteredKeyPersistentCache sets the metered License API Key persistent cache.
// Default value `true`, set to `false` will report the usage immediately to license server,
// this can be used when there's no access to persistent data storage.
func SetMeteredKeyPersistentCache (val bool ){_f .SetMeteredKeyPersistentCache (val )};

// GetLicenseKey returns the currently loaded license key.
func GetLicenseKey ()*LicenseKey {return _f .GetLicenseKey ()};

// SetMeteredKey sets the metered License API key required for SaaS operation.
// Document usage is reported periodically for the product to function correctly.
func SetMeteredKey (apiKey string )error {return _f .SetMeteredKey (apiKey )};

// SetLicenseKey sets and validates the license key.
func SetLicenseKey (content string ,customerName string )error {return _f .SetLicenseKey (content ,customerName );};

// LicenseKey represents a loaded license key.
type LicenseKey =_f .LicenseKey ;

// SetLegacyLicenseKey installs a legacy license code. License codes issued prior to June 2019.
// Will be removed at some point in a future major version.
func SetLegacyLicenseKey (s string )error {return _f .SetLegacyLicenseKey (s )};
func SetMeteredKeyPersistentCache (val bool ){_b .SetMeteredKeyPersistentCache (val )};

// LegacyLicense holds the old-style unioffice license information.
type LegacyLicense =_f .LegacyLicense ;
type LegacyLicense =_b .LegacyLicense ;

// LegacyLicenseType is the type of license
type LegacyLicenseType =_f .LegacyLicenseType ;
// GetLicenseKey returns the currently loaded license key.
func GetLicenseKey ()*LicenseKey {return _b .GetLicenseKey ()};

// GetMeteredState checks the currently used metered document usage status,
// documents used and credits available.
func GetMeteredState ()(_f .MeteredStatus ,error ){return _f .GetMeteredState ()};
func GetMeteredState ()(_b .MeteredStatus ,error ){return _b .GetMeteredState ()};

// LegacyLicenseType is the type of license
type LegacyLicenseType =_b .LegacyLicenseType ;

// MakeUnlicensedKey returns a default key.
func MakeUnlicensedKey ()*LicenseKey {return _f .MakeUnlicensedKey ()};const (LicenseTierUnlicensed =_f .LicenseTierUnlicensed ;LicenseTierCommunity =_f .LicenseTierCommunity ;LicenseTierIndividual =_f .LicenseTierIndividual ;LicenseTierBusiness =_f .LicenseTierBusiness ;
);
func MakeUnlicensedKey ()*LicenseKey {return _b .MakeUnlicensedKey ()};

// LicenseKey represents a loaded license key.
type LicenseKey =_b .LicenseKey ;

// SetLicenseKey sets and validates the license key.
func SetLicenseKey (content string ,customerName string )error {return _b .SetLicenseKey (content ,customerName );};const (LicenseTierUnlicensed =_b .LicenseTierUnlicensed ;LicenseTierCommunity =_b .LicenseTierCommunity ;LicenseTierIndividual =_b .LicenseTierIndividual ;
LicenseTierBusiness =_b .LicenseTierBusiness ;);

// SetMeteredKey sets the metered License API key required for SaaS operation.
// Document usage is reported periodically for the product to function correctly.
func SetMeteredKey (apiKey string )error {return _b .SetMeteredKey (apiKey )};
118 changes: 59 additions & 59 deletions common/logger/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,97 +9,97 @@
// Use of this source code is governed by the UniDoc End User License Agreement
// terms that can be accessed at https://unidoc.io/eula/

package logger ;import (_e "fmt";_b "io";_c "os";_dg "path/filepath";_d "runtime";);
package logger ;import (_db "fmt";_e "io";_ac "os";_a "path/filepath";_df "runtime";);

// Info logs info message.
func (_dfb ConsoleLogger )Info (format string ,args ...interface{}){if _dfb .LogLevel >=LogLevelInfo {_ae :="\u005bI\u004e\u0046\u004f\u005d\u0020";_dfb .output (_c .Stdout ,_ae ,format ,args ...);};};

// Warning logs warning message.
func (_ccg ConsoleLogger )Warning (format string ,args ...interface{}){if _ccg .LogLevel >=LogLevelWarning {_fd :="\u005b\u0057\u0041\u0052\u004e\u0049\u004e\u0047\u005d\u0020";_ccg .output (_c .Stdout ,_fd ,format ,args ...);};};func (_ed ConsoleLogger )output (_gfa _b .Writer ,_aad string ,_ce string ,_fcb ...interface{}){_fg (_gfa ,_aad ,_ce ,_fcb ...);
};

// ConsoleLogger is a logger that writes logs to the 'os.Stdout'
type ConsoleLogger struct{LogLevel LogLevel ;};func _fg (_bad _b .Writer ,_fgb string ,_fca string ,_ab ...interface{}){_ ,_gfg ,_bgd ,_fcf :=_d .Caller (3);if !_fcf {_gfg ="\u003f\u003f\u003f";_bgd =0;}else {_gfg =_dg .Base (_gfg );};_afa :=_e .Sprintf ("\u0025s\u0020\u0025\u0073\u003a\u0025\u0064 ",_fgb ,_gfg ,_bgd )+_fca +"\u000a";
_e .Fprintf (_bad ,_afa ,_ab ...);};
// Info does nothing for dummy logger.
func (DummyLogger )Info (format string ,args ...interface{}){};

// Notice logs notice message.
func (_fa ConsoleLogger )Notice (format string ,args ...interface{}){if _fa .LogLevel >=LogLevelNotice {_gf :="\u005bN\u004f\u0054\u0049\u0043\u0045\u005d ";_fa .output (_c .Stdout ,_gf ,format ,args ...);};};
// Error logs error message.
func (_bd ConsoleLogger )Error (format string ,args ...interface{}){if _bd .LogLevel >=LogLevelError {_gea :="\u005b\u0045\u0052\u0052\u004f\u0052\u005d\u0020";_bd .output (_ac .Stdout ,_gea ,format ,args ...);};};

// Debug logs debug message.
func (_fcc ConsoleLogger )Debug (format string ,args ...interface{}){if _fcc .LogLevel >=LogLevelDebug {_ba :="\u005b\u0044\u0045\u0042\u0055\u0047\u005d\u0020";_fcc .output (_c .Stdout ,_ba ,format ,args ...);};};

// Trace logs trace message.
func (_cd ConsoleLogger )Trace (format string ,args ...interface{}){if _cd .LogLevel >=LogLevelTrace {_aa :="\u005b\u0054\u0052\u0041\u0043\u0045\u005d\u0020";_cd .output (_c .Stdout ,_aa ,format ,args ...);};};
func (_ega ConsoleLogger )Debug (format string ,args ...interface{}){if _ega .LogLevel >=LogLevelDebug {_egd :="\u005b\u0044\u0045\u0042\u0055\u0047\u005d\u0020";_ega .output (_ac .Stdout ,_egd ,format ,args ...);};};func (_fc ConsoleLogger )output (_ab _e .Writer ,_gg string ,_bb string ,_ag ...interface{}){_egf (_ab ,_gg ,_bb ,_ag ...);
};

// Notice logs notice message.
func (_gc WriterLogger )Notice (format string ,args ...interface{}){if _gc .LogLevel >=LogLevelNotice {_gae :="\u005bN\u004f\u0054\u0049\u0043\u0045\u005d ";_gc .logToWriter (_gc .Output ,_gae ,format ,args ...);};};
// Warning logs warning message.
func (_dd ConsoleLogger )Warning (format string ,args ...interface{}){if _dd .LogLevel >=LogLevelWarning {_ae :="\u005b\u0057\u0041\u0052\u004e\u0049\u004e\u0047\u005d\u0020";_dd .output (_ac .Stdout ,_ae ,format ,args ...);};};

// IsLogLevel returns true if log level is greater or equal than `level`.
// Can be used to avoid resource intensive calls to loggers.
func (_af WriterLogger )IsLogLevel (level LogLevel )bool {return _af .LogLevel >=level };
func (_cc ConsoleLogger )IsLogLevel (level LogLevel )bool {return _cc .LogLevel >=level };

// Debug logs debug message.
func (_ee WriterLogger )Debug (format string ,args ...interface{}){if _ee .LogLevel >=LogLevelDebug {_gcc :="\u005b\u0044\u0045\u0042\u0055\u0047\u005d\u0020";_ee .logToWriter (_ee .Output ,_gcc ,format ,args ...);};};
// DummyLogger does nothing.
type DummyLogger struct{};

// Error logs error message.
func (_cc ConsoleLogger )Error (format string ,args ...interface{}){if _cc .LogLevel >=LogLevelError {_a :="\u005b\u0045\u0052\u0052\u004f\u0052\u005d\u0020";_cc .output (_c .Stdout ,_a ,format ,args ...);};};
func (_aed WriterLogger )Error (format string ,args ...interface{}){if _aed .LogLevel >=LogLevelError {_aee :="\u005b\u0045\u0052\u0052\u004f\u0052\u005d\u0020";_aed .logToWriter (_aed .Output ,_aee ,format ,args ...);};};

// WriterLogger is the logger that writes data to the Output writer
type WriterLogger struct{LogLevel LogLevel ;Output _b .Writer ;};

// Debug does nothing for dummy logger.
func (DummyLogger )Debug (format string ,args ...interface{}){};

// Logger is the interface used for logging in the unipdf package.
type Logger interface{Error (_fb string ,_fc ...interface{});Warning (_bc string ,_df ...interface{});Notice (_bd string ,_eb ...interface{});Info (_g string ,_dd ...interface{});Debug (_da string ,_dgf ...interface{});Trace (_ec string ,_bg ...interface{});
IsLogLevel (_fbb LogLevel )bool ;};func (_dgd WriterLogger )logToWriter (_bca _b .Writer ,_ag string ,_ef string ,_cb ...interface{}){_fg (_bca ,_ag ,_ef ,_cb );};var Log Logger =DummyLogger {};

// Trace does nothing for dummy logger.
func (DummyLogger )Trace (format string ,args ...interface{}){};

// IsLogLevel returns true from dummy logger.
func (DummyLogger )IsLogLevel (level LogLevel )bool {return true };

// NewConsoleLogger creates new console logger.
func NewConsoleLogger (logLevel LogLevel )*ConsoleLogger {return &ConsoleLogger {LogLevel :logLevel }};

// Trace logs trace message.
func (_ecc WriterLogger )Trace (format string ,args ...interface{}){if _ecc .LogLevel >=LogLevelTrace {_cg :="\u005b\u0054\u0052\u0041\u0043\u0045\u005d\u0020";_ecc .logToWriter (_ecc .Output ,_cg ,format ,args ...);};};
// ConsoleLogger is a logger that writes logs to the 'os.Stdout'
type ConsoleLogger struct{LogLevel LogLevel ;};

// Info logs info message.
func (_gfaca WriterLogger )Info (format string ,args ...interface{}){if _gfaca .LogLevel >=LogLevelInfo {_gac :="\u005bI\u004e\u0046\u004f\u005d\u0020";_gfaca .logToWriter (_gfaca .Output ,_gac ,format ,args ...);};};
// LogLevel is the verbosity level for logging.
type LogLevel int ;

// Warning does nothing for dummy logger.
func (DummyLogger )Warning (format string ,args ...interface{}){};

// Error does nothing for dummy logger.
func (DummyLogger )Error (format string ,args ...interface{}){};

// DummyLogger does nothing.
type DummyLogger struct{};
// Trace logs trace message.
func (_gda WriterLogger )Trace (format string ,args ...interface{}){if _gda .LogLevel >=LogLevelTrace {_gff :="\u005b\u0054\u0052\u0041\u0043\u0045\u005d\u0020";_gda .logToWriter (_gda .Output ,_gff ,format ,args ...);};};

// Trace does nothing for dummy logger.
func (DummyLogger )Trace (format string ,args ...interface{}){};

// Logger is the interface used for logging in the unipdf package.
type Logger interface{Error (_b string ,_c ...interface{});Warning (_g string ,_cf ...interface{});Notice (_ce string ,_f ...interface{});Info (_ge string ,_bg ...interface{});Debug (_fa string ,_gb ...interface{});Trace (_eg string ,_be ...interface{});
IsLogLevel (_fg LogLevel )bool ;};

// IsLogLevel returns true if log level is greater or equal than `level`.
// Can be used to avoid resource intensive calls to loggers.
func (_bde ConsoleLogger )IsLogLevel (level LogLevel )bool {return _bde .LogLevel >=level };
func (_bbc WriterLogger )IsLogLevel (level LogLevel )bool {return _bbc .LogLevel >=level };

// Warning logs warning message.
func (_ece WriterLogger )Warning (format string ,args ...interface{}){if _ece .LogLevel >=LogLevelWarning {_gfac :="\u005b\u0057\u0041\u0052\u004e\u0049\u004e\u0047\u005d\u0020";_ece .logToWriter (_ece .Output ,_gfac ,format ,args ...);};};const (LogLevelTrace LogLevel =5;
LogLevelDebug LogLevel =4;LogLevelInfo LogLevel =3;LogLevelNotice LogLevel =2;LogLevelWarning LogLevel =1;LogLevelError LogLevel =0;);
// Notice logs notice message.
func (_egb ConsoleLogger )Notice (format string ,args ...interface{}){if _egb .LogLevel >=LogLevelNotice {_ga :="\u005bN\u004f\u0054\u0049\u0043\u0045\u005d ";_egb .output (_ac .Stdout ,_ga ,format ,args ...);};};

// SetLogger sets 'logger' to be used by the unidoc unipdf library.
func SetLogger (logger Logger ){Log =logger };

// NewConsoleLogger creates new console logger.
func NewConsoleLogger (logLevel LogLevel )*ConsoleLogger {return &ConsoleLogger {LogLevel :logLevel }};var Log Logger =DummyLogger {};

// Info logs info message.
func (_bf WriterLogger )Info (format string ,args ...interface{}){if _bf .LogLevel >=LogLevelInfo {_aa :="\u005bI\u004e\u0046\u004f\u005d\u0020";_bf .logToWriter (_bf .Output ,_aa ,format ,args ...);};};

// Info logs info message.
func (_ca ConsoleLogger )Info (format string ,args ...interface{}){if _ca .LogLevel >=LogLevelInfo {_cag :="\u005bI\u004e\u0046\u004f\u005d\u0020";_ca .output (_ac .Stdout ,_cag ,format ,args ...);};};

// Notice does nothing for dummy logger.
func (DummyLogger )Notice (format string ,args ...interface{}){};

// LogLevel is the verbosity level for logging.
type LogLevel int ;
// WriterLogger is the logger that writes data to the Output writer
type WriterLogger struct{LogLevel LogLevel ;Output _e .Writer ;};

// Error logs error message.
func (_gfc WriterLogger )Error (format string ,args ...interface{}){if _gfc .LogLevel >=LogLevelError {_ga :="\u005b\u0045\u0052\u0052\u004f\u0052\u005d\u0020";_gfc .logToWriter (_gfc .Output ,_ga ,format ,args ...);};};
// Warning logs warning message.
func (_bgf WriterLogger )Warning (format string ,args ...interface{}){if _bgf .LogLevel >=LogLevelWarning {_gd :="\u005b\u0057\u0041\u0052\u004e\u0049\u004e\u0047\u005d\u0020";_bgf .logToWriter (_bgf .Output ,_gd ,format ,args ...);};};func _egf (_bgc _e .Writer ,_bda string ,_ed string ,_fdc ...interface{}){_ ,_acg ,_cae ,_ea :=_df .Caller (3);
if !_ea {_acg ="\u003f\u003f\u003f";_cae =0;}else {_acg =_a .Base (_acg );};_af :=_db .Sprintf ("\u0025s\u0020\u0025\u0073\u003a\u0025\u0064 ",_bda ,_acg ,_cae )+_ed +"\u000a";_db .Fprintf (_bgc ,_af ,_fdc ...);};

// Info does nothing for dummy logger.
func (DummyLogger )Info (format string ,args ...interface{}){};
// Debug does nothing for dummy logger.
func (DummyLogger )Debug (format string ,args ...interface{}){};

// IsLogLevel returns true from dummy logger.
func (DummyLogger )IsLogLevel (level LogLevel )bool {return true };

// Trace logs trace message.
func (_ec ConsoleLogger )Trace (format string ,args ...interface{}){if _ec .LogLevel >=LogLevelTrace {_dbe :="\u005b\u0054\u0052\u0041\u0043\u0045\u005d\u0020";_ec .output (_ac .Stdout ,_dbe ,format ,args ...);};};const (LogLevelTrace LogLevel =5;LogLevelDebug LogLevel =4;
LogLevelInfo LogLevel =3;LogLevelNotice LogLevel =2;LogLevelWarning LogLevel =1;LogLevelError LogLevel =0;);func (_agg WriterLogger )logToWriter (_beeg _e .Writer ,_cfc string ,_fd string ,_ecc ...interface{}){_egf (_beeg ,_cfc ,_fd ,_ecc );};

// Notice logs notice message.
func (_gf WriterLogger )Notice (format string ,args ...interface{}){if _gf .LogLevel >=LogLevelNotice {_bee :="\u005bN\u004f\u0054\u0049\u0043\u0045\u005d ";_gf .logToWriter (_gf .Output ,_bee ,format ,args ...);};};

// Debug logs debug message.
func (_faf WriterLogger )Debug (format string ,args ...interface{}){if _faf .LogLevel >=LogLevelDebug {_caf :="\u005b\u0044\u0045\u0042\u0055\u0047\u005d\u0020";_faf .logToWriter (_faf .Output ,_caf ,format ,args ...);};};

// NewWriterLogger creates new 'writer' logger.
func NewWriterLogger (logLevel LogLevel ,writer _b .Writer )*WriterLogger {logger :=WriterLogger {Output :writer ,LogLevel :logLevel };return &logger ;};
func NewWriterLogger (logLevel LogLevel ,writer _e .Writer )*WriterLogger {logger :=WriterLogger {Output :writer ,LogLevel :logLevel };return &logger ;};
26 changes: 13 additions & 13 deletions common/tempstorage/diskstore/diskstore.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,22 @@

// Package diskstore implements tempStorage interface
// by using disk as a storage
package diskstore ;import (_e "github.com/unidoc/unioffice/common/tempstorage";_c "io/ioutil";_g "os";_df "strings";);
package diskstore ;import (_df "github.com/unidoc/unioffice/common/tempstorage";_f "io/ioutil";_e "os";_d "strings";);

// SetAsStorage sets temp storage as a disk storage
func SetAsStorage (){_gc :=diskStorage {};_e .SetAsStorage (&_gc )};

// TempFile creates a new temp file by calling ioutil TempFile
func (_cd diskStorage )TempFile (dir ,pattern string )(_e .File ,error ){return _c .TempFile (dir ,pattern );};

// TempFile creates a new temp directory by calling ioutil TempDir
func (_ac diskStorage )TempDir (pattern string )(string ,error ){return _c .TempDir ("",pattern )};
// Open opens file from disk according to a path
func (_eg diskStorage )Open (path string )(_df .File ,error ){return _e .OpenFile (path ,_e .O_RDWR ,0644)};

// Add is not applicable in the diskstore implementation
func (_b diskStorage )Add (path string )error {return nil };
func (_a diskStorage )Add (path string )error {return nil };

// Open opens file from disk according to a path
func (_a diskStorage )Open (path string )(_e .File ,error ){return _g .OpenFile (path ,_g .O_RDWR ,0644)};
// SetAsStorage sets temp storage as a disk storage
func SetAsStorage (){_dd :=diskStorage {};_df .SetAsStorage (&_dd )};

// TempFile creates a new temp file by calling ioutil TempFile
func (_dg diskStorage )TempFile (dir ,pattern string )(_df .File ,error ){return _f .TempFile (dir ,pattern );};

// RemoveAll removes all files in the directory
func (_gcf diskStorage )RemoveAll (dir string )error {if _df .HasPrefix (dir ,_g .TempDir ()){return _g .RemoveAll (dir );};return nil ;};type diskStorage struct{};
func (_egd diskStorage )RemoveAll (dir string )error {if _d .HasPrefix (dir ,_e .TempDir ()){return _e .RemoveAll (dir );};return nil ;};type diskStorage struct{};

// TempFile creates a new temp directory by calling ioutil TempDir
func (_da diskStorage )TempDir (pattern string )(string ,error ){return _f .TempDir ("",pattern )};
Loading

0 comments on commit 378770e

Please sign in to comment.